void UnstableTile::dissolve (void) { if (state != STATE_NORMAL) return; if (sprite->has_action ("dissolve")) { state = STATE_DISSOLVE; this->set_action ("dissolve", /* loops = */ 1); } else { fall_down (); } }
void UnstableTile::update(float elapsed_time) { switch (state) { case STATE_NORMAL: break; case STATE_SHAKE: if (sprite->animation_done()) dissolve (); break; case STATE_DISSOLVE: if (sprite->animation_done()) { /* dissolving is done. Set to non-solid. */ set_group (COLGROUP_DISABLED); fall_down (); } break; case STATE_SLOWFALL: if (slowfall_timer >= elapsed_time) slowfall_timer -= elapsed_time; else /* Switch to normal falling procedure */ fall_down (); movement = physic.get_movement (elapsed_time); break; case STATE_FALL: if (sprite->animation_done()) remove_me (); else movement = physic.get_movement (elapsed_time); break; } }
int wiz_hit(struct monst *mtmp) { /* if we have stolen or found the amulet, we disappear */ if(mtmp->minvent && mtmp->minvent->olet == AMULET_SYM && mtmp->minvent->spe == 0) { /* vanish -- very primitive */ fall_down(mtmp); return(1); } /* if it is lying around someplace, we teleport to it */ if(!carrying(AMULET_OF_YENDOR)) { struct obj *otmp; for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp->olet == AMULET_SYM && !otmp->spe) { if((u.ux != otmp->ox || u.uy != otmp->oy) && !m_at(otmp->ox, otmp->oy)) { /* teleport to it and pick it up */ mtmp->mx = otmp->ox; mtmp->my = otmp->oy; freeobj(otmp); mpickobj(mtmp, otmp); pmon(mtmp); return(0); } goto hithim; } return(0); /* we don't know where it is */ } hithim: if(rn2(2)) { /* hit - perhaps steal */ /* if hit 1/20 chance of stealing amulet & vanish - amulet is on level 26 again. */ if(hitu(mtmp, d(mtmp->data->damn,mtmp->data->damd)) && !rn2(20) && stealamulet(mtmp)) ; } else inrange(mtmp); /* try magic */ return(0); }
int do_jump(string arg) { object me = this_player(); if( !arg || arg == "" ) return notify_fail("什么?\n"); if( arg == "cliff" ) { if( me->query_skill("dodge") < 150 ) return notify_fail("那麽高的铁栅栏,你蹦得上去麽?\n"); message_vision("$N纵身跃过铁栅栏,足底踏空,半个身子已在深渊之上,左足跟着跨出,全身向前急扑,往绝壁跳下!\n", me); me->set_temp("last_damage_from", "效仿真武跳崖飞升了"); fall_down(me, "char", 0); return 1; } return 0; }
void UnstableTile::slow_fall() { /* Only enter slow-fall if neither shake nor dissolve is available. */ if (state != STATE_NORMAL) { fall_down (); return; } if (sprite->has_action ("fall-down")) { state = STATE_SLOWFALL; set_action ("fall-down", /* loops = */ 1); physic.set_gravity_modifier (.10f); physic.enable_gravity (true); slowfall_timer = 0.5f; /* Fall slowly for half a second. */ } else { remove_me (); } }
void UnstableTile::update(float elapsed_time) { switch (state) { case STATE_NORMAL: break; case STATE_DISSOLVE: if (sprite->animation_done()) fall_down (); break; case STATE_FALL: if (sprite->animation_done()) remove_me (); else movement = physic.get_movement (elapsed_time); break; } }
int do_push(string who) { object me = this_player(); object victim, room, weapon; string attack_skill, dodge_skill, parry_skill; int ap, dp, pp; mapping prepare; victim = present(who, environment(me)); if( !who )return notify_fail("你想推什么?\n"); if( !victim ) return notify_fail("这个人不在这里吧。\n"); if( victim==me ) return notify_fail("指令格式:jump cliff\n"); if( me->is_busy() ) return notify_fail("你现在自顾都不暇,还有心思害别人?\n"); if( !victim->is_character() || victim->query("id") == "corpse" ) return notify_fail("要推,也只能推人下去才有意思啊。\n"); if( objectp(weapon = me->query_temp("weapon")) ) return notify_fail("拿着"+weapon->name()+"怎么推人?\n"); message_vision( CYN"\n$N一晃之际,已绕到$n身旁,突然劲贯双臂,猛的将$p向峭壁推去"NOR"!\n", me, victim); me->start_busy(1); if( !living(victim) ) { message_vision("$n往山谷中直栽下去。\n", me, victim); victim->set_temp("last_damage_from", "被"+me->name()+"推下悬崖摔死了"); fall_down(victim, "char", 0); victim->revive(); return 1; } prepare = me->query_skill_prepare(); if( !prepare ) prepare = ([]); switch( sizeof(prepare) ) { case 0: attack_skill = "unarmed"; break; case 1: attack_skill = (keys(prepare))[0]; break; case 2: attack_skill = (keys(prepare))[random(2)]; break; } ap = COMBAT_D->skill_power(me, attack_skill, SKILL_USAGE_ATTACK); dp = COMBAT_D->skill_power(victim, "dodge", SKILL_USAGE_DEFENSE); if( victim->is_busy() ) dp /= 3; if( random(ap + dp) < dp ) { dodge_skill = victim->query_skill_mapped("dodge"); if( !dodge_skill ) dodge_skill = "dodge"; message_vision(SKILL_D(dodge_skill)->query_dodge_msg(), me, victim); if( random( ap * 2 ) < dp && !random(10) ) { message_vision("$N全身力道都用在这一推之上,不料竟被$n避开,身形一晃,踏了个空,从悬崖旁摔了下去。\n", me, victim); me->set_temp("last_damage_from", "从百尺高空掉下,摔成一团肉泥"); fall_down(me, "char", 0); return 1; } else if( !victim->is_killing(me->query("id")) ) victim->kill_ob(me); return 1; } else { pp=COMBAT_D->skill_power(victim, "parry", SKILL_USAGE_DEFENSE); if( victim->is_busy() ) pp /= 2; if( random(ap + pp) < pp ) { parry_skill = victim->query_skill_mapped("parry"); if( !parry_skill || !SKILL_D(parry_skill)->parry_available() ) parry_skill = "parry"; message_vision(replace_string(SKILL_D(parry_skill)->query_parry_msg(victim->query_temp("weapon"), victim), "$w", "双手"), me, victim); if( !victim->is_killing(me->query("id")) ) victim->kill_ob(me); return 1; } message_vision("$n一个没站稳,不由自主的往山谷中掉了下去。\n", me, victim); victim->set_temp("last_damage_from", "被"+me->name()+"推下悬崖摔死了"); fall_down(victim, "char", 0); return 1; } }
int fall_down(object me, string type, int stage) { object *inv; int i, count; string dodge_skill; if( stage < sizeof(wudang) ) { switch( random(5) ) { case 1 : tell_object(me, "你只觉身子虚浮,全做不得主,只是笔直的跌落。\n"); break; case 2 : tell_object(me, "你耳旁风声呼呼,虽是顷刻间之事,却似无穷无尽,永远跌个没完。\n"); break; case 3 : tell_object(me, "你人在半空,虚虚晃晃,实是身不由己,全无半分着力处。\n"); break; case 4 : tell_object(me, "你只觉身旁风声虎虎,身子不住的向下摔落。\n"); break; default: tell_object(me, "你但觉耳旁风声不绝,顷刻之间,已到了"); break; } me->move(__DIR__+wudang[stage]); message("vision","你隐隐见到一人从山峰上直堕而下,一时却看不清是谁。\n", environment(me), me); fall_down(me, type, ++stage); return 1; } inv = all_inventory(environment(me)); for( i = 0; i < sizeof(inv); i++ ) if( inv[i]->is_character() && inv[i] != me ) { if( !random(25) && random(inv[i]->query_kar()) < 15 ) { tell_object(inv[i],"你赫然发现那人竟是向你直冲而来!!!\n"); tell_object(me,"你不由自主的笔直堕下,冲向一人,依稀看出是"+ inv[i]->name() +"。\n"); if( random(inv[i]->query_skill("dodge")) > 200 ) { dodge_skill = inv[i]->query_skill_mapped("dodge"); if( !dodge_skill ) dodge_skill = "dodge"; message_vision(SKILL_D(dodge_skill)->query_dodge_msg(), me, inv[i]); } else if( !inv[i]->query_temp("weapon") && random(inv[i]->query_skill("taiji-quan", 1)) > 100 && inv[i]->query_skill_prepared("unarmed") == "taiji-quan" && inv[i]->query_skill_mapped("parry") == "taiji-quan" ) { message_vision(CYN "$N当即使出一招「揽雀尾」,右脚实,左脚虚,运起“挤”字诀,粘连粘随,右掌已搭住$n,横劲发出,将$p下堕之力转直为横,将$n移得横飞出去。\n"NOR, inv[i], me); tell_object(inv[i], HIR"你只觉霎时之间头晕眼花,几欲坐倒。\n"NOR); inv[i]->set("neili", 0); } else { count++; message_vision("$n直冲入$N怀中,立时撞得$P腹破肠流,死于非命。\n", inv[i], me); inv[i]->receive_wound("qi", inv[i]->query("max_qi")+100, "被"+me->name()+"撞得腹破肠流,死于非命"); } break; } } if( !count ) { tell_object(me, "你直撞到石阶上,"); switch( random(3) ) { case 0 : tell_object(me, "鲜血迸流,鼻子歪在半边,却便似开了个油铺∶咸的,酸的,辣的,一发都滚出来。\n"); break; case 1 : tell_object(me, "眼棱缝裂,乌珠迸出,也似开了个彩帛铺的∶"HIR"红"NOR"的,"BLU"黑"NOR"的,"MAG"紫"NOR"的,都绽将出来。\n"); break; case 2 : tell_object(me, "太阳上正着,却似做了一全堂水陆的道场∶磐儿,钹儿,铙儿,一齐响。\n"); break; } message("vision", "只听得「砰」的一声巨响," +me->name()+"撞在石阶上,摔得粉身碎骨,成了一团肉浆。\n", environment(me), me); } me->receive_wound("qi", me->query("max_qi")+100, me->query_temp("last_damage_from")); inv = all_inventory(me); for( i = 0; i < sizeof(inv); i++ ) { if( inv[i]->is_character() ) inv[i]->receive_wound("qi", inv[i]->query("max_qi")+100, "被"+me->name()+"连累跌得粉身碎骨了"); } return 1; }
Short mon_in_trap(monst_t *mtmp) // was mintrap { trap_t *trap = trap_at(mtmp->mx, mtmp->my); Boolean wasintrap = (mtmp->bitflags & M_IS_TRAPPED); if (!trap) { mtmp->bitflags &= ~M_IS_TRAPPED; /* perhaps teleported? */ } else if (wasintrap) { if (!rund(40)) mtmp->bitflags &= ~M_IS_TRAPPED; } else { Short tt = get_trap_type(trap->trap_info); Short in_sight = cansee(mtmp->mx, mtmp->my); if (mtmp->mtraps_seen & (1 << tt)) { /* he has been in such a trap - perhaps he escapes */ if (rund(4)) return 0; } mtmp->mtraps_seen |= (1 << tt); switch (tt) { case BEAR_TRAP: if (StrChr(mlarge, mtmp->data->mlet)) { if (in_sight) { StrPrintF(ScratchBuffer,"%s is caught in a bear trap!",Monnam(mtmp)); message(ScratchBuffer); } else if (mtmp->data->mlet == 'o') message("You hear the roaring of an angry bear!"); mtmp->bitflags |= M_IS_TRAPPED; } break; case PIT: /* there should be a mtmp/data -> floating */ if (!StrChr("EywBfk'& ", mtmp->data->mlet)) { /* ab */ mtmp->bitflags |= M_IS_TRAPPED; if (in_sight) { StrPrintF(ScratchBuffer, "%s falls in a pit!", Monnam(mtmp)); message(ScratchBuffer); } } break; case SLP_GAS_TRAP: if (!(mtmp->bitflags & (M_IS_ASLEEP | M_IS_FROZEN))) { mtmp->bitflags |= M_IS_ASLEEP; if (in_sight) { StrPrintF(ScratchBuffer, "%s suddenly falls asleep!", Monnam(mtmp)); message(ScratchBuffer); } } break; case TELEP_TRAP: rloc(mtmp); if (in_sight && !cansee(mtmp->mx,mtmp->my)) { StrPrintF(ScratchBuffer, "%s suddenly disappears!", Monnam(mtmp)); message(ScratchBuffer); } break; case ARROW_TRAP: if (in_sight) { StrPrintF(ScratchBuffer, "%s is hit by an arrow!", Monnam(mtmp)); message(ScratchBuffer); } mtmp->mhp -= 3; break; case DART_TRAP: if (in_sight) { StrPrintF(ScratchBuffer, "%s is hit by a dart!", Monnam(mtmp)); message(ScratchBuffer); } mtmp->mhp -= 2; /* not mondied here !! */ break; case TRAPDOOR: if (!xdnstair) { mtmp->mhp -= 10; if (in_sight) { StrPrintF(ScratchBuffer, "A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp)); message(ScratchBuffer); } break; } if (mtmp->data->mlet != 'w') { fall_down(mtmp); if (in_sight) { StrPrintF(ScratchBuffer, "Suddenly, %s disappears out of sight.", monnam(mtmp)); message(ScratchBuffer); } return 2; /* no longer on this level */ } break; case PIERC: break; default: message("BUG: Some monster encountered a strange trap."); } } return ((mtmp->bitflags & M_IS_TRAPPED) != 0); }