UW: // режим графики игры Ultima Underworld DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (uw_mode_pos == 1) { ApplySPuw(); // Special UW mode } ... } void ApplySPuw() { uw_mode_pos=0; uw_mode=~uw_mode; ARX_SOUND_PlayCinematic("menestrel_uw2.wav"); // мелодия менестреля. Выводится только в «патче» от Dimoks и в Arx Libertatis, причём в «патче» мелодия сопровождает игрока, а в Arx Libertatis остаётся на месте. MakeCoolFx(&player.pos); // какой-то спецэффект if (uw_mode) { MakeSpCol(); strcpy(sp_max_ch,"~-__-~~-__.U.W.__-~~-__-~"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } } DANAE\Danae.cpp: HRESULT DANAE::Render(){ ... if (uw_mode) { float val=10.f; m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPMAPLODBIAS, *((LPDWORD) (&val)) ); ARX_SCENE_Render(m_pd3dDevice,1); val=-0.3f; m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPMAPLODBIAS, *((LPDWORD) (&val)) ); } ... } SOS: // открытие карт этажей DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_sos == 2) { cur_sos = 0; // сбрасывается ApplyCurSOS(); // SOS } ... } void ApplyCurSOS() { MakeSpCol(); ARX_MINIMAP_Reveal(); // открытие карт strcpy(sp_max_ch,"!!!_Temple of Elemental Lavis_!!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } SDSD: // большие головы персонажей DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_bh == 3) { cur_bh = 0; // сбрасывается EERIE_OBJECT_SetBHMode(); // SDSD } ... } void EERIE_OBJECT_SetBHMode() { if (BH_MODE) // если включено BH_MODE=0; // выключается else { BH_MODE=1; // иначе включается MakeCoolFx(&player.pos); // какой-то спецэффект MakeSpCol(); strcpy(sp_max_ch,"!!!_Super-Deformed_!!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } } DANAE\ARX_Cedric.cpp: static void Cedric_AnimateObject(INTERACTIVE_OBJ * io, EERIE_3DOBJ * eobj, ANIM_USE * animuse) { ... if (BH_MODE) { if (j == eobj->fastaccess.head_group) { scale.x += 1.f; // увеличение размеров головы на 100% scale.y += 1.f; scale.z += 1.f; } } ... } DANAE\ARX_FTL.cpp: EERIE_3DOBJ * ARX_FTL_Load(char * incomplete_fic, char * complete_fic, EERIE_3DOBJ * obj) { ... if (BH_MODE) EERIE_OBJECT_MakeBH(obj); ... } void EERIE_OBJECT_MakeBH(EERIE_3DOBJ * obj) { // пустая функция... } SAM: // Лук лорда Инута — Возможно ввести снова после смены локации DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_sm == 2) { cur_sm++; // 3? ApplySPBow(); // SAM } ... } void ApplySPBow() { { ARX_SPSound(); char tex[256]; char tex2[256]; sprintf(tex2,"%sGraph\\Obj3D\\Interactive\\Items\\Weapons\\bow_mx\\bow_mx.teo",Project.workingdir); File_Standardize(tex2,tex); INTERACTIVE_OBJ * ioo=(INTERACTIVE_OBJ *)AddItem(GDevice,tex,IO_IMMEDIATELOAD); // добавление лука if (ioo!=NULL) { // если добавление успешно MakeCoolFx(&player.pos); // какой-то спецэффект MakeCoolFx(&player.pos); ioo->scriptload=1; MakeTemporaryIOIdent(ioo); SendInitScriptEvent(ioo); // инициализация скрипта лука ioo->show=SHOW_FLAG_IN_INVENTORY; if (!CanBePutInInventory(ioo)) { // если инвентарь игрока полон PutInFrontOfPlayer(ioo,1); // помещает лук перед игроком } MakeSpCol(); strcpy(sp_max_ch,"!!!_Bow to Samy & Anne_!!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } } } POM: // Меч лорда Инута — одноразовое, блокируется после (MEGA + KAOM) x 11 DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_pom == 2) { cur_pom++; // 3? ApplySPWep(); // POM } ... } void ApplySPWep() { if (!sp_wep) { // если ещё не применялось ARX_SPSound(); char tex[256]; char tex2[256]; sprintf(tex2,"%sGraph\\Obj3D\\Interactive\\Items\\Weapons\\sword_mx\\sword_mx.teo",Project.workingdir); File_Standardize(tex2,tex); INTERACTIVE_OBJ * ioo=(INTERACTIVE_OBJ *)AddItem(GDevice,tex,IO_IMMEDIATELOAD); // добавление меча if (ioo!=NULL) { // если добавление успешно sp_wep=1; // применение записано MakeCoolFx(&player.pos); // какой-то спецэффект MakeCoolFx(&player.pos); ioo->scriptload=1; MakeTemporaryIOIdent(ioo); SendInitScriptEvent(ioo); // инициализация меча ioo->show=SHOW_FLAG_IN_INVENTORY; if (!CanBePutInInventory(ioo)) { // если инвентарь игрока полон PutInFrontOfPlayer(ioo,1); // помещает меч перед игроком } MakeSpCol(); strcpy(sp_max_ch,"!!!_Grosbillite_!!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } } } DANAE\ARX_ChangeLevel.cpp: long ARX_CHANGELEVEL_Push_Player(long num) { // смена уровня ... if (sp_wep) // если "POM" применён asp->sp_flags |= SP_WEP; // записывает глобальный флаг (если игру сохранить, то в дальнейшем получение меча этим словом силы невозможно) ... } PLPL: // изменение визуализации и прочие странности, 3 режима и отключение, при отключении никаких последствий DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_pnux == 3) { cur_pnux++; // 4? ApplyCurPNux(); // PLPL } ... } void ApplyCurPNux() { { MakeSpCol(); strcpy(sp_max_ch,"! PhilNux & Gluonne !"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); if (SPECIAL_PNUX<3) { // если режим по 2-ой SPECIAL_PNUX++; // прибавляет 1 } else { // если 3-ий режим SPECIAL_PNUX=0; // сбрасывает — выключение "PLPL" } D3DTextr_InvalidateAllTextures(); D3DTextr_RestoreAllTextures(GDevice); ARX_PLAYER_Restore_Skin(); cur_pnux=0; // сбрасывает распознаватель символов для "PLPL" sp_max_start=ARX_TIME_Get(); } } DANAE\ARX_Player.cpp: void ARX_PLAYER_ComputePlayerFullStats() { ... if (SPECIAL_PNUX) { // случайные модификаторы при включённом режиме (прибавки, в вещественных числах) player.Mod_Attribute_Strength += (long)(float)(rnd() * 5.f); // случайное число от 0 до 5 player.Mod_Attribute_Mind += (long)(float)(rnd() * 5.f); player.Mod_Attribute_Constitution += (long)(float)(rnd() * 5.f); player.Mod_Attribute_Dexterity += (long)(float)(rnd() * 5.f); player.Mod_Skill_Stealth += (long)(float)(rnd() * 20.f); // от 0 до 20 player.Mod_Skill_Mecanism += (long)(float)(rnd() * 20.f); player.Mod_Skill_Intuition += (long)(float)(rnd() * 20.f); player.Mod_Skill_Etheral_Link += (long)(float)(rnd() * 20.f); player.Mod_Skill_Object_Knowledge += (long)(float)(rnd() * 20.f); player.Mod_Skill_Casting += (long)(float)(rnd() * 20.f); player.Mod_Skill_Projectile += (long)(float)(rnd() * 20.f); player.Mod_Skill_Close_Combat += (long)(float)(rnd() * 20.f); player.Mod_Skill_Defense += (long)(float)(rnd() * 30.f); // от 0 до 30 player.Mod_resist_magic += (long)(float)(rnd() * 20.f); player.Mod_resist_poison += (long)(float)(rnd() * 20.f); player.Mod_Critical_Hit += (long)(float)(rnd() * 20.f); player.Mod_damages += (long)(float)(rnd() * 20.f); player.Mod_armor_class += (long)(float)(rnd() * 20.f); } ... } //Игры со цветами и прочим смотрите сами в файле "EERIE\EERIETexture.cpp" при использовании ненулевого "SPECIAL_PNUX". MAX: // Фантомас DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_mx == 2) { cur_mx = 3; // не отключается, после ввода всех трёх рун переменная становится константой... ApplySPMax(); // MAX } ... } void ApplySPMax() { MakeCoolFx(&player.pos); // какой-то спецэффект sp_max=~sp_max; if (sp_max) { // если применено слово силы "MAX" MakeSpCol(); strcpy(sp_max_ch,"!!!_FaNt0mAc1e_!!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); player.skin=4; // голова игрока ARX_EQUIPMENT_RecreatePlayerMesh(); // перестроение модели игрока ARX_PLAYER_Rune_Add_All(); // добавление всех рун в книгу игрока _TCHAR UText[512]; MultiByteToWideChar(CP_ACP, 0, "!!!!!!! FanTomAciE !!!!!!!", -1, UText, 256); ARX_SPEECH_Add(NULL, UText); // вывод сообщения вверху экрана player.Attribute_Redistribute+=10; // даёт 10 очков характеристик для распределения player.Skill_Redistribute+=50; // даёт 50 очков навыков для распределения player.level=__max(player.level,10); // устанавливает игроку 10-ый уровень player.xp=GetXPforLevel(10); // и соответствующий опыт } else { // иначе TextureContainer * tcm=MakeTCFromFile("Graph\\Obj3D\\Textures\\npc_human_cm_hero_head.bmp"); if (tcm) { D3DTextr_KillTexture(tcm); player.heads[0]=MakeTCFromFile("Graph\\Obj3D\\Textures\\npc_human_base_hero_head.bmp"); player.heads[1]=MakeTCFromFile("Graph\\Obj3D\\Textures\\npc_human_base_hero2_head.bmp"); player.heads[2]=MakeTCFromFile("Graph\\Obj3D\\Textures\\npc_human_base_hero3_head.bmp"); ARX_EQUIPMENT_RecreatePlayerMesh(); } } } long ARX_SPELLS_Launch( const long& typ, const long& source, const long& flagss, const long& levell, const long& target, const long& duration) //const long &netspell) { ... if ( sp_max ) { // уровень заклинаний level = __max( level, 15 ); // максимальное между заданным уровнем и 15-ю. У всех заклинателей, кроме игрока, уровень ограничивается 10-ым. } ... case SPELL_MAGIC_MISSILE: // Launching MAGIC_MISSILE { ... if ( ( sp_max ) || ( cur_rf == 3 ) ) { // если включено "MAX" или "RAF" ARX_CHECK_LONG(spells[i].caster_level); number = ARX_CLEAN_WARN_CAST_LONG( spells[i].caster_level ); // количество магических стрел равно уровню заклинания } else { // иначе зависит от уровня заклинания if ( spells[i].caster_level < 3 ) number = 1; else if ( spells[i].caster_level < 5 ) number = 2; else if ( spells[i].caster_level < 7 ) number = 3; else if ( spells[i].caster_level < 9 ) number = 4; else number=5; } ... } ... } void ARX_SPELLS_Update(LPDIRECT3DDEVICE7 m_pd3dDevice) { ... case SPELL_SUMMON_CREATURE: { // при призыве демона ... if ((rnd()>0.997f) || (sp_max && (rnd()>0.8f)) || ((cur_mr>=3) && (rnd()>0.3f))) { // при включённом "MAX" появляется женщина-илсид в золотых доспехах с вероятностью 20% sprintf(tmptext,"%sGraph\\Obj3D\\Interactive\\NPC\\Y_mx\\Y_mx.asl",Project.workingdir); tokeep=0; // не требует маны для поддержания, заклинание прекращает действие } ... } ... } DANAE\ARX_ChangeLevel.cpp: long ARX_CHANGELEVEL_Push_Player(long num) { // смена уровня ... if (sp_max) // если "MAX" применено asp->sp_flags |= SP_MAX; // устанавливает глобальный флаг — "MAX" включено ... } DANAE\ARX_Player.cpp: void ARX_PLAYER_ComputePlayerFullStats() { ... if (sp_max) { // модификаторы при включённом режиме player.Mod_Attribute_Strength += 5; // прибавляет 5 к силе player.Mod_Attribute_Mind += 5; // разуму player.Mod_Attribute_Constitution += 5; // выносливости player.Mod_Attribute_Dexterity += 5; // ловкости player.Mod_Skill_Stealth += 50; // прибавляет 50 к навыку незаметности player.Mod_Skill_Mecanism += 50; // механики player.Mod_Skill_Intuition += 50; // интуиции player.Mod_Skill_Etheral_Link += 50; // медитации player.Mod_Skill_Object_Knowledge += 50; // ремесла player.Mod_Skill_Casting += 50; // магии player.Mod_Skill_Projectile += 50; // стрельбы player.Mod_Skill_Close_Combat += 50; // ближнего боя player.Mod_Skill_Defense += 50; // защиты player.Mod_resist_magic += 10; // прибавляет 10 к устойчивости к магии player.Mod_resist_poison += 10; // устойчивости к яду player.Mod_Critical_Hit += 50; // прибавляет 50 к вероятности критического удара player.Mod_damages += 10; // прибавляет 10 к урону player.Mod_armor_class += 20; // прибавляет 20 к классу брони player.Full_AimTime = 100; // устанавливает время прицеливания } ... } void ARX_PLAYER_Manage_Visual() { ... if (!BLOCK_PLAYER_CONTROLS) // если управление игроком не отключено if (sp_max) { // если "MAX" включено io->halo.color.r = 1.f; // красное свечение io->halo.color.g = 0.f; // вокруг игрока io->halo.color.b = 0.f; io->halo.flags |= HALO_ACTIVE | HALO_DYNLIGHT; // включено, и оно динамическое io->halo.radius = 20.f; // радиус свечения 20 миллиметров? player.life += (float)FrameDiff * DIV10; // DIV10 == 0.1f, FrameDiff — задержка между кадрами, она предположительно равна "1000/частота_кадров" player.life = __min(player.life, player.maxlife); // после прибавки выставляется здоровью минимальное значение между полученным и максимальным базовым player.mana += (float)FrameDiff * DIV10; player.mana = __min(player.mana, player.maxmana); // после прибавки выставляется мане минимальное значение между полученным и максимальным базовым } ... } DANAE\Danae.cpp: void PlayerLaunchArrow(float aimratio,float poisonous) { ... if ((sp_max) && (poisonous<3.f)) // если "MAX" включено и отравление стрел меньше 3 poisonous=3.f; // стрелы отравляются ядом 3-го уровня ... if (sp_max) { // если "MAX" включено, игрок выпускает 5 стрел веером (4 дополнительные) EERIE_3D angle; EERIE_3D pos; pos.x=player.pos.x; pos.y=player.pos.y+40.f; pos.z=player.pos.z; angle.a=player.angle.a; angle.b=player.angle.b+8; angle.g=player.angle.g; PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle); angle.a=player.angle.a; angle.b=player.angle.b-8; PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle); angle.a=player.angle.a; angle.b=player.angle.b+4.f; PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle); angle.a=player.angle.a; angle.b=player.angle.b-4.f; PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle); } ... } MAR: // Марианна DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_mr == 2) { cur_mr = 3; // не отключается MakeCoolFx(&player.pos); // какой-то спецэффект ApplyCurMr(); // MAR } ... } void ApplyCurMr() { if (cur_mr==3) { MakeSpCol(); strcpy(sp_max_ch,"!!! Marianna !!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } } void ARX_SPELLS_Update(LPDIRECT3DDEVICE7 m_pd3dDevice) { ... case SPELL_SUMMON_CREATURE: { // при призыве демона ... if ((rnd()>0.997f) || (sp_max && (rnd()>0.8f)) || ((cur_mr>=3) && (rnd()>0.3f))) { // при включённом "MAR" появляется женщина-илсид в золотых доспехах с вероятностью 70%. У гигантской крысы вероятность появления снижается до 20%, так как проверка её 70% идёт до этой. Таблицу вероятностей появления существ можно посмотреть здесь: http://wiki.arx-libertatis.org/Summon sprintf(tmptext,"%sGraph\\Obj3D\\Interactive\\NPC\\Y_mx\\Y_mx.asl",Project.workingdir); tokeep=0; // не требует маны для поддержания, заклинание прекращает действие } ... } ... } DANAE\ARX_ChangeLevel.cpp: long ARX_CHANGELEVEL_Push_Player(long num) { // смена уровня ... if (cur_mr == 3) // если "MAR" применено asp->sp_flags |= SP_MR; // устанавливает глобальный флаг — "MAR" включено ... } DANAE\ARX_Player.cpp: void ARX_PLAYER_ComputePlayerFullStats() { ... if (cur_mr == 3) { // модификаторы при включённом режиме player.Mod_Attribute_Strength += 1; // прибавка к силе player.Mod_Attribute_Mind += 10; // разуму player.Mod_Attribute_Constitution += 1; // выносливости player.Mod_Attribute_Dexterity += 10; // ловкости player.Mod_Skill_Stealth += 5; // прибавка к навыку незаметности player.Mod_Skill_Mecanism += 5; // механики player.Mod_Skill_Intuition += 100; // интуиции player.Mod_Skill_Etheral_Link += 100; // медитации player.Mod_Skill_Object_Knowledge += 100; // ремесла player.Mod_Skill_Casting += 5; // магии player.Mod_Skill_Projectile += 5; // стрельбы player.Mod_Skill_Close_Combat += 5; // ближнего боя player.Mod_Skill_Defense += 100; // защиты player.Mod_resist_magic += 100; // прибавка к устойчивости к магии player.Mod_resist_poison += 100; // устойчивости к яду player.Mod_Critical_Hit += 5; // прибавка к вероятности критического удара player.Mod_damages += 2; // прибавка к урону player.Mod_armor_class += 100; // классу брони player.Full_AimTime = 100; // устанавливает время прицеливания } ... } void ARX_PLAYER_Manage_Visual() { ... if (cur_mr == 3) { player.life += (float)FrameDiff * DIV20; // DIV20 == 0.05f, FrameDiff — задержка между кадрами, она предположительно равна "1000/частота_кадров" player.life = __min(player.life, player.maxlife); // после прибавки выставляется здоровью минимальное значение между полученным и максимальным базовым player.mana += (float)FrameDiff * DIV20; player.mana = __min(player.mana, player.maxmana); // после прибавки выставляется мане минимальное значение между полученным и максимальным базовым } ... } void ARX_PLAYER_Manage_Movement() { ... if (cur_mr == 3) speedfactor += 0.5f; // скорость движения игрока увеличивается на 50% ... } DANAE\Danae.cpp: void CheckMr() { if (cur_mr==3) { // показывает портрет женщины (возможно Марианны) в правом верхнем углу экрана if (GDevice && Mr_tc && TextureContainer_Exist(Mr_tc)) { if (!Mr_tc->m_pddsSurface) Mr_tc->Restore(GDevice); EERIEDrawBitmap(GDevice,DANAESIZX-(128.f*Xratio),0.f,(float)128*Xratio,(float)128*Yratio,0.0001f, Mr_tc,_EERIERGB(0.5f+PULSATE*DIV10)); } else { Mr_tc=MakeTCFromFile_NoRefinement("graph\\particles\\(Fx)_Mr.bmp"); } } HRESULT DANAE::Render() { ... if (cur_mr==3) speedfactor+=0.5f; // скорость движения игрока увеличивается на 50%; если действует вместе с той прибавкой, то движения игрока ускоряются в 2 раза... ... } DANAE\ARX_Particles.cpp: void ManageTorch() { ... else if (cur_mr==3) { // включает розовое(?) свечение вокруг игрока будто от факела el->pos.x = player.pos.x; el->pos.y=player.pos.y; el->pos.z = player.pos.z; el->intensity=1.8f; el->fallstart=480.f; el->fallend = el->fallstart + 480.f; el->exist=1; el->rgb.r = 1.f; el->rgb.g = 0.5f; el->rgb.b = 0.8f; el->duration=0; el->extras=0; } ... } DANAE\ARX_SpellFX_Lvl01.cpp: void LaunchMagicMissileExplosion(EERIE_3D & _ePos, int t = 0, long spellinstance = -1) { ... if ((spellinstance >= 0) && (spells[spellinstance].caster == 0) && (cur_mr == 3)) { // изменение цвета взрыва магических стрел? cp.fStartSize = 20; cp.fSpeed = 13; cp.fSpeedRandom = 10; cp.fStartColorRandom[0] = 0; cp.fStartColorRandom[1] = 0; cp.fStartColorRandom[2] = 0; cp.fStartColorRandom[3] = 0; cp.fStartColor[0] = 0; cp.fStartColor[1] = 0; cp.fStartColor[2] = 0; cp.fStartColor[3] = 0; cp.fEndColor[0] = 255; cp.fEndColor[1] = 40; cp.fEndColor[2] = 120; cp.fEndColor[3] = 10;//55; pPS->SetTexture("graph\\particles\\(fx)_mr.bmp", 0, 500); } ... if ((spellinstance >= 0) && (spells[spellinstance].caster == 0) && (cur_mr == 3)) { // меняет цвет взрыва магических стрел на розовый(?) DynLight[id].rgb.r = 1.f; DynLight[id].rgb.g = 0.3f; DynLight[id].rgb.b = .8f; } ... } float CMagicMissile::Render(LPDIRECT3DDEVICE7 m_pd3dDevice) { ... if ((spells[spellinstance].caster == 0) && (cur_mr == 3)) SETTC(m_pd3dDevice, NULL); // изменяет текстуру при рендеринге? ... if ((spells[spellinstance].caster == 0) && (cur_mr == 3)) { //меняет цвет магических стрел при рендеринге на розовый(?) stitecolor.r = 1.f; stitecolor.g = 0.f; stitecolor.b = 0.2f; } ... } void CMultiMagicMissile::Create(EERIE_3D aePos, EERIE_3D angles) { ... if ((spells[spellinstance].caster == 0) && (cur_mr == 3)) { // меняет цвет магических стрел на розовый(?) при создании pMM->SetColor(0.9f, 0.2f, 0.5f); pMM->SetColor1(0.9f, 0.2f, 0.5f); } ... if ((spells[spellinstance].caster == 0) && (cur_mr == 3)) { // и снова изменение цвета... Что именно меняет цвет, не знаю, да и нет желания выяснять. el->rgb.r = 1; el->rgb.g = 0.3f; el->rgb.b = 0.8f; } ... } RAF: // ускорение и прочее DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if (cur_rf == 2) { cur_rf = 3; // не отключается MakeCoolFx(&player.pos); // какой-то спецэффект ApplySPRf(); // RAF } ... } void ApplySPRf() { if (cur_rf==3) { MakeSpCol(); strcpy(sp_max_ch,"!!! RaFMode !!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } } long ARX_SPELLS_Launch( const long& typ, const long& source, const long& flagss, const long& levell, const long& target, const long& duration) //const long &netspell) { ... if ( cur_rf == 3 ) { // при включённом "RAF" отключает проверку наличия рун в книге игрока и использование маны flags |= SPELLCAST_FLAG_NOCHECKCANCAST | SPELLCAST_FLAG_NOMANA; level += 2; // прибавляет 2 к уровню магии, ограничивая его для всех заклинателей 10-ым, а для игрока — 1-ым. В «патче» от Dimoks и в репозитории Arx Libertatis (вероятно будет и в релизе версии 1.1) ограничение для игрока снято, а для прочих заклинателей выставлено в 12-ый уровень. } ... case SPELL_MAGIC_MISSILE: // Launching MAGIC_MISSILE { ... if ( ( sp_max ) || ( cur_rf == 3 ) ) { // если включено "MAX" или "RAF" ARX_CHECK_LONG(spells[i].caster_level); number = ARX_CLEAN_WARN_CAST_LONG( spells[i].caster_level ); // количество магических стрел равно уровню заклинания } else { // иначе зависит от уровня заклинания if ( spells[i].caster_level < 3 ) number = 1; else if ( spells[i].caster_level < 5 ) number = 2; else if ( spells[i].caster_level < 7 ) number = 3; else if ( spells[i].caster_level < 9 ) number = 4; else number=5; } ... } ... } void ARX_SPELLS_Update(LPDIRECT3DDEVICE7 m_pd3dDevice) { ... case SPELL_SUMMON_CREATURE: { // при призыве демона ... if ((rnd()>0.997f) || ((cur_rf>=3) && (rnd()>0.8f)) || ((cur_mr>=3) && (rnd()>0.3f))) { // при включённом "RAF" появляется гигантская крыса с вероятностью 20% sprintf(tmptext,"%sGraph\\Obj3D\\Interactive\\NPC\\WRat_base\\WRat_base.asl",Project.workingdir); tokeep=-1; // не требует маны для поддержания, заклинание прекращает действие } ... } ... } DANAE\ARX_ChangeLevel.cpp: long ARX_CHANGELEVEL_Push_Player(long num) { // смена уровня ... if (cur_rf == 3) // если "RAF" применено asp->sp_flags |= SP_RF; // устанавливает глобальный флаг — "RAF" включено ... } DANAE\ARX_Player.cpp: void ARX_PLAYER_ComputePlayerFullStats() { ... if (cur_rf == 3) { // модификаторы при включённом режиме player.Mod_Attribute_Mind += 10; // прибавка к разуму player.Mod_Skill_Casting += 100; // к навыку магии player.Mod_Skill_Etheral_Link += 100; // медитации player.Mod_Skill_Object_Knowledge += 100; // ремесла player.Mod_resist_magic += 20; // прибавка к устойчивости к магии player.Mod_resist_poison += 20; // устойчивости к яду player.Mod_damages += 1; // прибавка к урону player.Mod_armor_class += 5; // к классу брони } ... } void ARX_PLAYER_Manage_Movement() { ... if (cur_rf == 3) speedfactor += 1.5f; // скорость движения игрока увеличивается на 150% ... } DANAE\Danae.cpp: HRESULT DANAE::Render() { ... if (cur_rf==3) speedfactor+=1.5f; // скорость движения игрока увеличивается на 150%; если действует вместе с той прибавкой, то движения игрока ускоряются в 4 раза... ... } STAIRS: // хождение сквозь стены, отключение столкновений игрока (3 лесенки) DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... passwall++; if (passwall==3) { // введено три лесенки passwall=0; // сбрасывается ApplyPasswall(); // STAIRS } ... } void ApplyPasswall() { MakeSpCol(); strcpy(sp_max_ch,"!!! PassWall !!!"); // пляшущий текст посреди экрана sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); if (USE_PLAYERCOLLISIONS) USE_PLAYERCOLLISIONS=0; // столкновения игрока отключены, включение полёта сквозь стены else USE_PLAYERCOLLISIONS=1; // столкновения игрока включены, полёт отключён } DANAE\ARX_Interface.cpp void DANAE::ManagePlayerControls() { ... if (!USE_PLAYERCOLLISIONS) { // если столкновения игрока отключены if (this->kbd.inkey[INKEY_PAGEUP]) { // кнопка "Page Up" поднимает игрока if (!USE_PLAYERCOLLISIONS) moveto.y=player.pos.y=player.pos.y-10.f; // подняться на 10 см. } if (this->kbd.inkey[INKEY_PAGEDOWN]) { // кнопка "Page Down" опускает игрока moveto.y=player.pos.y=player.pos.y+10.f; // опуститься на 10 см. } } ... } UP & DOWN: // смена головы игрока (3 раза вверх и вниз) DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... player.skin++; // переключает номер головы на следующий if ((player.skin==4) && (rnd()<0.9f)) // если получился номер 4, с вероятностью 90% player.skin++; // номер головы меняется на следующий if (player.skin>5) // если получился номер больше 5-го, то player.skin=0; // номер головы меняется на нулевой (базовая голова) ARX_EQUIPMENT_RecreatePlayerMesh(); // перестройка модели игрока ... } (MEGA + KAOM) x 11 // + 2 раза: — золотые доспехи, блокирует POM, одноразовое DANAE\ARX_Spells.cpp: void ARX_SPELLS_AnalyseSYMBOL() { ... if ((cur_arm>=0) && !(cur_arm & 1) ) { // если "MEGA" нечётная cur_arm++; // прибавляет 1 к счётчику } else cur_arm=-1; // иначе сбрасывает счётчик ... if ((cur_arm>=0) && (cur_arm & 1) ) { // если "KAOM" чётная cur_arm++; // прибавляет 1 счётчику if (cur_arm>20) // если счётчик больше 20-ти ApplySPArm(); // применяет "(MEGA + KAOM) x 11" в первый раз. После можно повторить "MEGA + KAOM" ещё два раза, чтобы получить все три части доспехов сразу. } else cur_arm=-1; // иначе сбрасывает счётчик ... } void ApplySPArm() { ARX_SPSound(); // звук надевания Крагоз и Зогарка char tex[256]; char tex2[256]; switch (sp_arm) { // переключатель части доспехов case 0: // первая sprintf(tex2,"%sGraph\\Obj3D\\Interactive\\Items\\Armor\\Helmet_plate_cm\\Helmet_plate_cm.teo",Project.workingdir); // Золотой шлем break; case 1: // вторая sprintf(tex2,"%sGraph\\Obj3D\\Interactive\\Items\\Armor\\Legging_plate_cm\\Legging_plate_cm.teo",Project.workingdir); // Золотые поножи break; case 2: // третья sprintf(tex2,"%sGraph\\Obj3D\\Interactive\\Items\\Armor\\Chest_plate_cm\\Chest_plate_cm.teo",Project.workingdir); // Золотой нагрудник break; default: return; break; } File_Standardize(tex2,tex); INTERACTIVE_OBJ * ioo=(INTERACTIVE_OBJ *)AddItem(GDevice,tex,IO_IMMEDIATELOAD); // добавление части доспехов на уровень if (ioo!=NULL) { sp_wep=1; // блокирует "POM" — получение меча лорда Инута более невозможно, если он не был получен ранее MakeCoolFx(&player.pos); // какой-то спецэффект MakeCoolFx(&player.pos); ioo->scriptload=1; MakeTemporaryIOIdent(ioo); SendInitScriptEvent(ioo); // инициализация скрипта части доспеха ioo->show=SHOW_FLAG_IN_INVENTORY; if (!CanBePutInInventory(ioo)) { // если помещение части доспехов в инвентарь невозможно, то PutInFrontOfPlayer(ioo,1); // она выкладывается перед игроком } MakeSpCol(); strcpy(sp_max_ch,"!! Toi aussi cherches les Cheats !!"); // пляшущий текст посреди экрана. Конкретно этот увидеть не получается, он сразу меняется на следующий, если не все части доспехов получены switch (sp_arm) { case 0: strcpy(sp_max_ch,"------ZoliChapo------"); // пляшущий текст посреди экрана break; case 1: strcpy(sp_max_ch,"-----TiteBottine-----"); // пляшущий текст посреди экрана break; case 2: strcpy(sp_max_ch,"-----Roooo-La-La-----"); // пляшущий текст посреди экрана break; default: return; break; } sp_max_nb=strlen(sp_max_ch); sp_max_start=ARX_TIME_Get(); } sp_arm++; } DANAE\ARX_ChangeLevel.cpp: long ARX_CHANGELEVEL_Push_Player(long num) { // смена уровня ... if (sp_arm == 1) // если получена первая часть золотых доспехов asp->sp_flags |= SP_ARM1; // выставляет глобальный флаг о получении ... if (sp_arm == 2) // если получена вторая часть золотых доспехов asp->sp_flags |= SP_ARM2; // выставляет глобальный флаг о получении ... if (sp_arm == 3) // если получена третья часть золотых доспехов asp->sp_flags |= SP_ARM3; // выставляет глобальный флаг о получении ... }