TbBool prison_convert_creature_to_skeleton(struct Room *room, struct Thing *thing) { struct Dungeon *dungeon; struct CreatureControl *cctrl; struct Thing *crthing; long crmodel; cctrl = creature_control_get_from_thing(thing); crmodel = get_room_create_creature_model(room->kind); // That normally returns skeleton breed crthing = create_creature(&thing->mappos, crmodel, room->owner); if (thing_is_invalid(crthing)) { ERRORLOG("Couldn't create creature %s in prison", creature_code_name(crmodel)); return false; } init_creature_level(crthing, cctrl->explevel); set_start_state(crthing); if (creature_model_bleeds(thing->model)) create_effect_around_thing(thing, TngEff_Unknown10); kill_creature(thing, INVALID_THING, -1, CrDed_NoEffects); dungeon = get_dungeon(room->owner); if (!dungeon_invalid(dungeon)) { dungeon->lvstats.skeletons_raised++; } return true; }
TbBool create_transferred_creature_on_level(void) { struct Thing *thing; struct Coord3d *pos; if (game.intralvl_transfered_creature.model > 0) { thing = get_player_soul_container(my_player_number); pos = &(thing->mappos); thing = create_creature(pos, game.intralvl_transfered_creature.model, 5); if (thing_is_invalid(thing)) return false; init_creature_level(thing, game.intralvl_transfered_creature.explevel); clear_transfered_creature(); return true; } return false; }
void resurrect_creature(struct Thing *boxtng, PlayerNumber owner, ThingModel crmodel, unsigned char crlevel) { struct Thing *creatng; if (!thing_exists(boxtng) || (box_thing_to_special(boxtng) != SpcKind_Resurrect) ) { ERRORMSG("Invalid resurrect box object!"); return; } creatng = create_creature(&boxtng->mappos, crmodel, owner); if (!thing_is_invalid(creatng)) { init_creature_level(creatng, crlevel); if (is_my_player_number(owner)) output_message(SMsg_CommonAcknowledge, 0, true); } create_special_used_effect(&boxtng->mappos, owner); remove_events_thing_is_attached_to(boxtng); force_any_creature_dragging_owned_thing_to_drop_it(boxtng); if ((gameadd.classic_bugs_flags & ClscBug_ResurrectForever) == 0) { remove_item_from_dead_creature_list(get_players_num_dungeon(owner), crmodel, crlevel); } delete_thing_structure(boxtng, 0); }
short thing_create_thing(struct InitThing *itng) { struct Thing *thing; if (itng->owner == 7) { ERRORLOG("Invalid owning player %d, fixing to %d", (int)itng->owner, (int)game.hero_player_num); itng->owner = game.hero_player_num; } else if (itng->owner == 8) { ERRORLOG("Invalid owning player %d, fixing to %d", (int)itng->owner, (int)game.neutral_player_num); itng->owner = game.neutral_player_num; } if (itng->owner > 5) { ERRORLOG("Invalid owning player %d, thing discarded", (int)itng->owner); return false; } switch (itng->oclass) { case TCls_Object: thing = create_thing(&itng->mappos, itng->oclass, itng->model, itng->owner, itng->index); if (!thing_is_invalid(thing)) { if (itng->model == 49) //HERO_GATE thing->byte_13 = itng->params[1]; check_and_asimilate_thing_by_room(thing); // make sure we don't have invalid pointer thing = INVALID_THING; } else { ERRORLOG("Couldn't create object model %d", (int)itng->model); return false; } break; case TCls_Creature: thing = create_creature(&itng->mappos, itng->model, itng->owner); if (thing_is_invalid(thing)) { ERRORLOG("Couldn't create creature model %d", (int)itng->model); return false; } init_creature_level(thing, itng->params[1]); break; case TCls_EffectGen: thing = create_effect_generator(&itng->mappos, itng->model, itng->range, itng->owner, itng->index); if (thing_is_invalid(thing)) { ERRORLOG("Couldn't create effect generator model %d", (int)itng->model); return false; } break; case TCls_Trap: thing = create_thing(&itng->mappos, itng->oclass, itng->model, itng->owner, itng->index); if (thing_is_invalid(thing)) { ERRORLOG("Couldn't create trap model %d", (int)itng->model); return false; } break; case TCls_Door: thing = create_door(&itng->mappos, itng->model, itng->params[0], itng->owner, itng->params[1]); if (thing_is_invalid(thing)) { ERRORLOG("Couldn't create door model %d", (int)itng->model); return false; } break; case 10: case 11: thing = create_thing(&itng->mappos, itng->oclass, itng->model, itng->owner, itng->index); if (thing_is_invalid(thing)) { ERRORLOG("Couldn't create thing class %d model %d", (int)itng->oclass, (int)itng->model); return false; } break; default: ERRORLOG("Invalid class %d, thing discarded", (int)itng->oclass); return false; } return true; }