Mercurial > parpg-core
comparison src/parpg/gamemodel.py @ 162:79c186b69603
Split code off from createInventoryItems to createItemByID and createItemByType.
Entities with a containable component will now get the "item_type" field set to the Template, if that field is not present.
author | KarstenBock@gmx.net |
---|---|
date | Sat, 08 Oct 2011 14:18:16 +0200 |
parents | d1f9652d0651 |
children | 097782ae9c77 |
comparison
equal
deleted
inserted
replaced
161:d1f9652d0651 | 162:79c186b69603 |
---|---|
369 def createAgent(self, agent, inst_id, world): | 369 def createAgent(self, agent, inst_id, world): |
370 if self.game_state.hasObject(inst_id): | 370 if self.game_state.hasObject(inst_id): |
371 return None | 371 return None |
372 entity_data = deepcopy(agent["Entity"]) | 372 entity_data = deepcopy(agent["Entity"]) |
373 entity_data["fifeagent"] = {} | 373 entity_data["fifeagent"] = {} |
374 template = None | |
374 if agent.has_key("Template"): | 375 if agent.has_key("Template"): |
375 entity_data = self.checkAttributes(entity_data, agent["Template"]) | 376 template = agent["Template"] |
377 entity_data = self.checkAttributes(entity_data, template) | |
376 object_id = (entity_data["graphics"]["gfx"] | 378 object_id = (entity_data["graphics"]["gfx"] |
377 if entity_data.has_key("graphics") and | 379 if entity_data.has_key("graphics") and |
378 entity_data["graphics"].has_key("gfx") | 380 entity_data["graphics"].has_key("gfx") |
379 else self.GENERIC_ITEM_GFX | 381 else self.GENERIC_ITEM_GFX |
380 ) | 382 ) |
416 entity_data["behaviour"]["behaviour_type"])() | 418 entity_data["behaviour"]["behaviour_type"])() |
417 else: | 419 else: |
418 entity_data["fifeagent"]["behaviour"] = behaviours.Base() | 420 entity_data["fifeagent"]["behaviour"] = behaviours.Base() |
419 if self.dialogues.has_key(inst_id): | 421 if self.dialogues.has_key(inst_id): |
420 entity_data["dialogue"] = {} | 422 entity_data["dialogue"] = {} |
421 entity_data["dialogue"]["dialogue"] = self.dialogues[inst_id] | 423 entity_data["dialogue"]["dialogue"] = self.dialogues[inst_id] |
424 if (entity_data.has_key("containable") and not | |
425 entity_data["containable"].has_key("item_type") | |
426 ): | |
427 entity_data["containable"]["item_type"] = template | |
428 | |
422 | 429 |
423 obj = self.createMapObject(self.active_map.agent_layer, entity_data, inst_id, world) | 430 obj = self.createMapObject(self.active_map.agent_layer, entity_data, inst_id, world) |
424 | 431 |
425 if agent.has_key("Inventory"): | 432 if agent.has_key("Inventory"): |
426 inv = agent["Inventory"] | 433 inv = agent["Inventory"] |
427 self.create_inventory_items(inv, obj, world) | 434 self.createInventoryItems(inv, obj, world) |
428 | 435 |
429 if agent.has_key("Equipment"): | 436 if agent.has_key("Equipment"): |
430 for slot, data in agent["Equipment"].iteritems(): | 437 for slot, data in agent["Equipment"].iteritems(): |
431 item = None | 438 item = None |
432 if data.has_key("type"): | 439 if data.has_key("type"): |
433 item_type = data["type"] | 440 item_type = data["type"] |
434 item_data = {} | 441 item_data = {} |
435 item_data = self.checkAttributes(item_data, item_type) | 442 item_data = self.checkAttributes(item_data, item_type) |
436 if item_data.has_key("containable") and item_data.has_key("equipable"): | 443 if item_data.has_key("containable") and item_data.has_key("equipable"): |
437 item = self.create_item( | 444 item = self.createItem( |
438 self.createUniqueID(data["ID"]), | 445 self.createUniqueID(data["ID"]), |
439 item_data, world, item_type) | 446 item_data, world, item_type) |
440 else: | 447 else: |
441 raise Exception("Item %s is not containable or equipable." % item_type) | 448 raise Exception("Item %s is not containable or equipable." % item_type) |
442 else: | 449 else: |
444 if self.game_state.hasObject(identifier): | 451 if self.game_state.hasObject(identifier): |
445 item = self.game_state.getObjectById(identifier) | 452 item = self.game_state.getObjectById(identifier) |
446 else: | 453 else: |
447 item_data = self.items[identifier]["Entity"] | 454 item_data = self.items[identifier]["Entity"] |
448 item_type = item_data["containable"]["item_type"] | 455 item_type = item_data["containable"]["item_type"] |
449 item = self.create_item(identifier, item_data, | 456 item = self.createItem(identifier, item_data, |
450 world, item_type) | 457 world, item_type) |
451 equip.equip(obj.equip, item.equipable, slot) | 458 equip.equip(obj.equip, item.equipable, slot) |
452 if (obj.fifeagent and (obj.lockable and not obj.lockable.closed)): | 459 if (obj.fifeagent and (obj.lockable and not obj.lockable.closed)): |
453 obj.fifeagent.behaviour.animate("opened", repeating=True) | 460 obj.fifeagent.behaviour.animate("opened", repeating=True) |
454 return obj | 461 return obj |
455 | 462 |
456 def create_inventory_items(self, inv, obj, world): | 463 def createInventoryItems(self, inv, obj, world): |
457 slots = inv["Slots"] | 464 slots = inv["Slots"] |
458 obj.container.children = list() | 465 obj.container.children = list() |
459 for x in xrange(slots): | 466 for x in xrange(slots): |
460 obj.container.children.append(None) | 467 obj.container.children.append(None) |
461 items = inv["Items"] if inv.has_key("Items") else list() | 468 items = inv["Items"] if inv.has_key("Items") else list() |
462 for data in items: | 469 for data in items: |
463 item = None | 470 item = None |
464 slot = data["Slot"] if data.has_key("Slot") else -1 | 471 slot = data["Slot"] if data.has_key("Slot") else -1 |
465 if data.has_key("type"): | 472 if data.has_key("type"): |
466 item_type = data["type"] | 473 item_type = data["type"] |
467 item_data = {} | 474 item = self.createItemByType(item_type, data["ID"], world) |
468 item_data = self.checkAttributes(item_data, item_type) | |
469 if item_data.has_key("containable"): | |
470 item = self.create_item( | |
471 self.createUniqueID(data["ID"]), | |
472 item_data, world, item_type) | |
473 else: | |
474 raise Exception("Item %s is not containable." % item_type) | |
475 else: | 475 else: |
476 identifier = data["ID"] | 476 identifier = data["ID"] |
477 if self.game_state.hasObject(identifier): | 477 item = self.createItemByID(world, identifier) |
478 item = self.game_state.getObjectById(identifier) | |
479 else: | |
480 agent_data = self.items[identifier] | |
481 item_data = agent_data["Entity"] | |
482 item_type = item_data["containable"]["item_type"] | |
483 item = self.create_item(identifier, item_data, | |
484 world, item_type) | |
485 if item.container and agent_data.has_key("Inventory"): | |
486 self.create_inventory_items(agent_data["Inventory"], | |
487 item, world) | |
488 | 478 |
489 container.put_item(obj.container, item.containable, slot) | 479 container.put_item(obj.container, item.containable, slot) |
490 | 480 |
491 def create_item(self, identifier, item_data, world, item_type): | 481 def createItemByID(self, world, identifier): |
482 if self.game_state.hasObject(identifier): | |
483 item = self.game_state.getObjectById(identifier) | |
484 else: | |
485 agent_data = self.items[identifier] | |
486 item_data = agent_data["Entity"] | |
487 item_type = item_data["containable"]["item_type"] | |
488 item = self.createItem(identifier, item_data, | |
489 world, item_type) | |
490 if item.container and agent_data.has_key("Inventory"): | |
491 self.createInventoryItems(agent_data["Inventory"], | |
492 item, world) | |
493 return item | |
494 | |
495 def createItemByType(self, item_type, identifier, world): | |
496 item_data = {} | |
497 item_data = self.checkAttributes(item_data, item_type) | |
498 if item_data.has_key("containable"): | |
499 return self.createItem( self.createUniqueID(identifier), | |
500 item_data, world, item_type) | |
501 else: | |
502 raise Exception("Item %s is not containable." % item_type) | |
503 | |
504 def createItem(self, identifier, item_data, world, item_type): | |
492 if not item_data["description"].has_key("view_name"): | 505 if not item_data["description"].has_key("view_name"): |
493 item_data["description"]["view_name"] = ( | 506 item_data["description"]["view_name"] = ( |
494 item_data["description"]["real_name"]) | 507 item_data["description"]["real_name"]) |
495 item = createEntity(item_data, identifier, world, None) | 508 item = createEntity(item_data, identifier, world, None) |
496 item.containable.item_type = item_type | 509 item.containable.item_type = item_type |