diff --git a/kod/include/blakston.khd b/kod/include/blakston.khd index 1da93435d6..9c95590db5 100644 --- a/kod/include/blakston.khd +++ b/kod/include/blakston.khd @@ -775,7 +775,8 @@ RID_NECROAREA3B = 832 RID_BRAX_BUILDING2 = 832 RID_BRAX_ARENA = 833 - RID_BRAX_END = 833 + RID_NECROAREA6 = 834 + RID_BRAX_END = 834 RID_BOURGEOIS = 850 RID_CASTLE2A = 850 @@ -1796,6 +1797,8 @@ TID_XEO_HOLY = 71 TID_XEO_NERU = 72 TID_XEO_ILL = 73 + + TID_SKELETON5 = 74 // English articles diff --git a/kod/object/active/holder/nomoveon/battler/monster/skel/gdaemskel.kod b/kod/object/active/holder/nomoveon/battler/monster/skel/gdaemskel.kod new file mode 100644 index 0000000000..9b323aa774 --- /dev/null +++ b/kod/object/active/holder/nomoveon/battler/monster/skel/gdaemskel.kod @@ -0,0 +1,113 @@ +// Meridian 59, Copyright 1994-2012 Andrew Kirmse and Chris Kirmse. +// All rights reserved. +// +// This software is distributed under a license that is described in +// the LICENSE file that accompanies it. +// +// Meridian is a registered trademark. + + +//////////////////////////////////////////////////////////////////////////////// +GiantDaemonSkeleton is Skeleton + +constants: + + include blakston.khd + + DEMENTIA_CHANCE = 20 + +resources: + + include gdaemskel.lkod + + GiantDaemonSkeleton_koc_name_rsc = "gikochaleoc" + GiantDaemonSkeleton_name_rsc = "giant daemon skeleton" + GiantDaemonSkeleton_icon_rsc = gskelbody.bgf + GiantDaemonSkeleton_desc_rsc = \ + "The sight alone of this abomination of nature is often enough to " + "paralyze a human. You shudder to think what dark ritual brought " + "this creature into being." + + GiantDaemonSkeleton_head = gskelhed4.bgf + GiantDaemonSkeleton_dead_icon_rsc = skelX.bgf + GiantDaemonSkeleton_dead_name_rsc = "pile of bones" + + GiantDaemonSkeleton_sound_miss = skl4_atk.ogg + GiantDaemonSkeleton_sound_death = skl4_die.ogg + GiantDaemonSkeleton_sound_aware = skl4_awr.ogg + +classvars: + + vrKocName = GiantDaemonSkeleton_koc_name_rsc + vrName = GiantDaemonSkeleton_name_rsc + vrIcon = GiantDaemonSkeleton_icon_rsc + vrDesc = GiantDaemonSkeleton_desc_rsc + vrDead_icon = GiantDaemonSkeleton_dead_icon_rsc + vrDead_name = GiantDaemonSkeleton_dead_name_rsc + + viTreasure_type = TID_SKELETON5 + viSpeed = SPEED_FAST + viAttack_type = ATCK_WEAP_THRUST + viAttributes = 0 + viLevel = 150 + viDifficulty = 9 + viVisionDistance = 20 + // Attack range of 192, or 3 row/col. + viAttackRange = 192 + viKarma = -100 + viDefault_behavior = \ + AI_FIGHT_AGGRESSIVE | AI_FIGHT_HYPERAGGRESSIVE \ + | AI_FIGHT_SWITCHALOT | AI_MOVE_FLEE_FRIGHTENERS + viCashmin = 2589 + viCashmax = 4225 + vrSound_miss = DaemonSkeleton_sound_miss + vrSound_aware = DaemonSkeleton_sound_aware + vrSound_death = DaemonSkeleton_sound_death + + vrHeadIcon = GiantDaemonSkeleton_head + +properties: + + piAnimation = ANIM_NONE + +messages: + + SetResistances() + { + plResistances = [ [ATCK_WEAP_PIERCE, 70 ], + [ATCK_WEAP_THRUST, 70 ], + [-ATCK_SPELL_UNHOLY, 70 ], + [-ATCK_SPELL_SHOCK, 70 ], + [-ATCK_SPELL_FIRE, 70 ], + [-ATCK_SPELL_COLD, -10 ], + [-ATCK_SPELL_HOLY, -20 ], + [ATCK_WEAP_BLUDGEON, -20 ] + ]; + + return; + } + + HitSideEffect(what = $, who = $) + { + local oSpell; + + oSpell = Send(SYS,@FindSpellByNum,#num=SID_DEMENT); + if NOT Send(what,@IsEnchanted,#what=oSpell) + AND Random(1,DEMENTIA_CHANCE) = 1 + { + if who <> $ + { + Send(oSpell,@CastSpell,#who=who,#lTargets=[what],#iSpellPower=15, + #bItemCast=TRUE); + } + else + { + Send(oSpell,@DoSpell,#what=self,#oTarget=what,#iSpellPower=15); + } + } + + return; + } + +end +//////////////////////////////////////////////////////////////////////////////// diff --git a/kod/object/active/holder/nomoveon/battler/monster/skel/gdaemskel.lkod b/kod/object/active/holder/nomoveon/battler/monster/skel/gdaemskel.lkod new file mode 100644 index 0000000000..40bbaf40d0 --- /dev/null +++ b/kod/object/active/holder/nomoveon/battler/monster/skel/gdaemskel.lkod @@ -0,0 +1,7 @@ +GiantDaemonSkeleton_koc_name_rsc = de "gikochaleoc" +GiantDaemonSkeleton_name_rsc = de "Das Riesen Dämonenskelett" +GiantDaemonSkeleton_desc_rsc = de \ + "Allein der Anblick dieser Abnormalität der Natur ist oft genug umeinen " + "Menschen erstarren zu lassen. Du schauderst, als Du daran denkst,was " + "für ein dunkles Ritual diese Abnormalität zum Leben erweckt hat!" +GiantDaemonSkeleton_dead_name_rsc = de "Ein großer Knochenhaufen" diff --git a/kod/object/active/holder/nomoveon/battler/monster/skel/makefile b/kod/object/active/holder/nomoveon/battler/monster/skel/makefile index 89612ac999..5465d46b8c 100644 --- a/kod/object/active/holder/nomoveon/battler/monster/skel/makefile +++ b/kod/object/active/holder/nomoveon/battler/monster/skel/makefile @@ -5,7 +5,7 @@ !include $(TOPDIR)\common.mak DEPEND = ..\skel.bof -BOFS = batrskel.bof daemskel.bof tuskskel.bof +BOFS = batrskel.bof daemskel.bof tuskskel.bof gdaemskel.bof !include $(KODDIR)\kod.mak diff --git a/kod/object/active/holder/room/monsroom/makefile b/kod/object/active/holder/room/monsroom/makefile index 16bbe14cbc..32c7a01fad 100644 --- a/kod/object/active/holder/room/monsroom/makefile +++ b/kod/object/active/holder/room/monsroom/makefile @@ -19,7 +19,7 @@ BOFS = badland1.bof a5.bof a6.bof c4.bof c6.bof castle1b.bof d4.bof d5.bof \ necarea3.bof necare3a.bof necare3b.bof necarea4.bof necarea5.bof \ marcryp1.bof marcryp2.bof marcry3a.bof castle2b.bof castle2c.bof \ throne2.bof survivalroom.bof castle1d.bof tossecret.bof farolwest.bof \ - razaforest.bof oldtown.bof d6e6.bof d6e6ulake.bof + razaforest.bof oldtown.bof d6e6.bof d6e6ulake.bof necarea6.bof # g7.bof h8.bof i2.bof i4.bof i5.bof \ # j4.bof j5.bof j6.bof j7.bof j8.bof j9.bof k3.bof \ diff --git a/kod/object/active/holder/room/monsroom/necarea3.kod b/kod/object/active/holder/room/monsroom/necarea3.kod index 11f22b735b..a1f1ae15fe 100644 --- a/kod/object/active/holder/room/monsroom/necarea3.kod +++ b/kod/object/active/holder/room/monsroom/necarea3.kod @@ -100,9 +100,11 @@ messages: plExits = $; - // Locked gate to the north - plExits = Cons([ 5, 20, ROOM_LOCKED_DOOR, Necropolis3_locked_gate ],plExits); - plExits = Cons([ 5, 21, ROOM_LOCKED_DOOR, Necropolis3_locked_gate ],plExits); + // To Daemon Skeleton + plExits = Cons([ 1, 18, RID_NECROAREA6, 31, 11, ROTATE_NONE ],plExits); + plExits = Cons([ 1, 19, RID_NECROAREA6, 31, 11, ROTATE_NONE ],plExits); + plExits = Cons([ 1, 20, RID_NECROAREA6, 31, 11, ROTATE_NONE ],plExits); + // Southwest abandoned building plExits = Cons([ 19, 12, ROOM_LOCKED_DOOR, Necropolis3_locked_door ],plExits); diff --git a/kod/object/active/holder/room/monsroom/necarea6.kod b/kod/object/active/holder/room/monsroom/necarea6.kod new file mode 100644 index 0000000000..794f01cc25 --- /dev/null +++ b/kod/object/active/holder/room/monsroom/necarea6.kod @@ -0,0 +1,190 @@ +// Meridian 59, Copyright 1994-2012 Andrew Kirmse and Chris Kirmse. +// All rights reserved. +// +// This software is distributed under a license that is described in +// the LICENSE file that accompanies it. +// +// Meridian is a registered trademark. + + +/////////////////////////////////////////////////////////////////////////////////// +Necropolis6 is MonsterRoom + +constants: + + include blakston.khd + include protocol.khd + + GIANT_ROW = 6 + GIANT_COL = 11 + + HOUR_MILLI = 900000 + +// FENCE SECTORS +// FENCE_1 = 3 +// FENCE_2 = 4 +// FENCE_3 = 5 + +resources: + + include necarea6.lkod + + room_name_Necropolis6 = "Decaying City of Brax II" + room_Necropolis6 = necarea6.roo + Necropolis6_music = nec02.ogg + + Necropolis6_loop = necloop4.ogg + + Necropolis6_no_rift = "Casting shadow rift here would be pointless." + + fence_open_sound = doordown.ogg + fence_close_sound = doorrsup.ogg + +classvars: + + vrName = room_name_Necropolis6 + + viTeleport_row = 27 + viTeleport_col = 11 + + viTerrain_type = TERRAIN_NECROPOLIS + +properties: + + prRoom = room_Necropolis6 + piRoom_num = RID_NECROAREA6 + + piBaseLight = LIGHT_MIN + piOutside_factor = 0 + + piGen_time = 25000 + piGen_percent = 80 + + piInit_count_min = 7 + piInit_count_max = 9 + + piMonster_count_max = 25 + + prMusic = Necropolis6_music + + ptGiant_gen = $ + +messages: + + CreateStandardExits() + { + + plExits = $; + + // To NECROAREA 3 + plExits = Cons([ 32, 10, RID_NECROAREA3, 2, 19, ROTATE_NONE ],plExits); + plExits = Cons([ 32, 11, RID_NECROAREA3, 2, 19, ROTATE_NONE ],plExits); + plExits = Cons([ 32, 12, RID_NECROAREA3, 2, 19, ROTATE_NONE ],plExits); + + // To INSIDE + plExits = Cons([ 22, 10, RID_NECROAREA6, 20, 11, ROTATE_NONE ],plExits); + plExits = Cons([ 22, 11, RID_NECROAREA6, 20, 11, ROTATE_NONE ],plExits); + plExits = Cons([ 22, 12, RID_NECROAREA6, 20, 11, ROTATE_NONE ],plExits); + + plExits = Cons([ 21, 10, RID_NECROAREA6, 22, 11, ROTATE_NONE ],plExits); + plExits = Cons([ 21, 11, RID_NECROAREA6, 22, 11, ROTATE_NONE ],plExits); + plExits = Cons([ 21, 12, RID_NECROAREA6, 22, 11, ROTATE_NONE ],plExits); + + propagate; + } + + + ReqSpellCast(who = $, oSpell = $, lItems = $) + { + if IsClass(oSpell,&DeathsDoor) + { + Send(who,@MsgSendUser,#message_rsc=Necropolis6_no_rift); + + return FALSE; + } + + propagate; + } + + + Constructed() + { + plMonsters = [ [&DaemonSkeleton, 70], [&TuskedSkeleton, 30] ]; + plGenerators = [ [10,9], [10,14], [13,14], [15,9], [17,9], [17,14] ]; + + plLooping_sounds = [[ Necropolis4_loop, 0, 0, 200, 100 ]]; + + Send(self,@GiantGenTimer); + + propagate; + + } + + + GiantGenTimer() + { + local i,bFound,each_obj; + + ptGiant_gen = $; + + bFound = FALSE; + foreach i in plActive + { + each_obj = Send(self,@HolderExtractObject,#data=i); + if IsClass(each_obj,&GiantDaemonSkeleton) + { + bFound = TRUE; + } + } + + if not bFound + { + Send(self,@NewHold,#what=Create(&GiantDaemonSkeleton),#new_row=GIANT_ROW,#new_col=GIANT_COL); + } + + ptGiant_gen = CreateTimer(self,@GiantGenTimer,1*HOUR_MILLI); + + return; + } + + + CreateStandardObjects() + { + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_NECSLIME), + #new_row=18,#new_col=8,#fine_row=56,#fine_col=0,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_NECSLIME), + #new_row=5,#new_col=14,#fine_row=0,#fine_col=48,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_NECSLIME), + #new_row=20,#new_col=16,#fine_row=56,#fine_col=8,#angle=ANGLE_EAST); + + Send(self,@NewHold,#what=Create(&Skull), + #new_row=19,#new_col=8,#fine_row=8,#fine_col=40,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_HALFSKULL), + #new_row=19,#new_col=9,#fine_row=0,#fine_col=8,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&Skull), + #new_row=15,#new_col=12,#fine_row=48,#fine_col=8,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_HALFSKULL), + #new_row=16,#new_col=11,#fine_row=24,#fine_col=0,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&Skull), + #new_row=12,#new_col=13,#fine_row=8,#fine_col=0,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_HALFSKULL), + #new_row=11,#new_col=11,#fine_row=16,#fine_col=40,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&Skull), + #new_row=7,#new_col=10,#fine_row=48,#fine_col=16,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_HALFSKULL), + #new_row=7,#new_col=13,#fine_row=56,#fine_col=0,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&Skull), + #new_row=6,#new_col=10,#fine_row=24,#fine_col=0,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_HALFSKULL), + #new_row=5,#new_col=12,#fine_row=24,#fine_col=24,#angle=ANGLE_EAST); + + Send(self,@NewHold,#what=Create(&OrnamentalObject,#type=OO_NECTREE4), + #new_row=27,#new_col=9,#fine_row=0,#fine_col=48,#angle=ANGLE_EAST); + Send(self,@NewHold,#what=Create(&GlowTree), + #new_row=22,#new_col=13,#fine_row=48,#fine_col=48,#angle=ANGLE_EAST); + + propagate; + } + +end +//////////////////////////////////////////////////////////////////////////////// diff --git a/kod/object/active/holder/room/monsroom/necarea6.lkod b/kod/object/active/holder/room/monsroom/necarea6.lkod new file mode 100644 index 0000000000..6c514c34fa --- /dev/null +++ b/kod/object/active/holder/room/monsroom/necarea6.lkod @@ -0,0 +1,2 @@ +room_name_Necropolis6 = de "Die verfallende Stadt von Brax II" +Necropolis6_no_rift = de "Hier Schattenriss zu zaubern würde nutzlos sein." diff --git a/kod/object/passive/trestype/makefile b/kod/object/passive/trestype/makefile index 2cb7180e32..5767d17fb4 100644 --- a/kod/object/passive/trestype/makefile +++ b/kod/object/passive/trestype/makefile @@ -16,6 +16,6 @@ BOFS = wimptres.bof notres.bof spquent.bof med-tght.bof wmp-medt.bof \ statuet.bof kriipat.bof molluskt.bof shadowbeastt.bof ratktres.bof \ earthelet.bof fireelet.bof iceelet.bof neruelet.bof easterbunnyt.bof \ killerbunnyt.bof xeoairt.bof xeoeartht.bof xeofiret.bof xeowatert.bof \ - xeoacidt.bof xeounholyt.bof xeoholyt.bof xeonerut.bof xeoillt.bof + xeoacidt.bof xeounholyt.bof xeoholyt.bof xeonerut.bof xeoillt.bof skel5t.bof !include $(KODDIR)\kod.mak diff --git a/kod/object/passive/trestype/skel5t.kod b/kod/object/passive/trestype/skel5t.kod new file mode 100644 index 0000000000..1fe4de3b44 --- /dev/null +++ b/kod/object/passive/trestype/skel5t.kod @@ -0,0 +1,49 @@ +// Meridian 59, Copyright 1994-2012 Andrew Kirmse and Chris Kirmse. +// All rights reserved. +// +// This software is distributed under a license that is described in +// the LICENSE file that accompanies it. +// +// Meridian is a registered trademark. + + +//////////////////////////////////////////////////////////////////////////////// +Skeleton5Treasure is TreasureType + +constants: + + include blakston.khd + +classvars: + + viTreasure_num = TID_SKELETON5 + +properties: + + piItem_att_chance = 3 + piDIff_seed = 9 + +messages: + + Constructed() + { + plTreasure = [ [ &Scimitar, 2 ], + [ &BlueDragonScale, 33 ], + [ &SilverArrow, 2 ], + [ &DarkAngelFeather, 30 ], + [ &Circlet, 3 ], + [ &Gauntlet, 2 ], + [ &SimpleHelm, 2 ], + [ &DaemonHelm, 15 ], + [ &InkyCap, 7 ], + [ &IdentifyWand, 1 ], + [ &WindScroll, 1 ], + [ &KillingFieldScroll, 1 ], + [ &DementWand, 1 ] + ]; + + propagate; + } + +end +//////////////////////////////////////////////////////////////////////////////// diff --git a/kod/util/system.kod b/kod/util/system.kod index 1ca27b96a4..6e8f3981e8 100644 --- a/kod/util/system.kod +++ b/kod/util/system.kod @@ -2576,6 +2576,7 @@ messages: Send(self,@CreateOneRoomIfNew,#num=RID_NECROAREA3B,#class=&Necropolis3b); Send(self,@CreateOneRoomIfNew,#num=RID_NECROAREA4,#class=&Necropolis4); Send(self,@CreateOneRoomIfNew,#num=RID_NECROAREA5,#class=&Necropolis5); + Send(self,@CreateOneRoomIfNew,#num=RID_NECROAREA6,#class=&Necropolis6); Send(self,@CreateOneRoomIfNew,#num=RID_LICH_MAZE,#class=&LichMaze); Send(self,@CreateOneRoomIfNew,#num=RID_BRAX_ARENA,#class=&NecArena); Send(self,@CreateOneRoomIfNew,#num=RID_KA0,#class=&OutdoorsKA0); @@ -3935,6 +3936,7 @@ messages: Create(&Skeleton2Treasure); Create(&Skeleton3Treasure); Create(&Skeleton4Treasure); + Create(&Skeleton5Treasure); Create(&WormLarvaTreasure); Create(&WormQueenTreasure); @@ -5317,6 +5319,7 @@ messages: plMonsterTemplates = cons(create(&BatteredSkeleton),plMonsterTemplates); plMonsterTemplates = cons(create(&TuskedSkeleton),plMonsterTemplates); plMonsterTemplates = cons(create(&DaemonSkeleton),plMonsterTemplates); + plMonsterTemplates = cons(create(&GiantDaemonSkeleton),plMonsterTemplates); plMonsterTemplates = cons(create(&NarthylWorm),plMonsterTemplates); plMonsterTemplates = cons(create(&DeathSpider),plMonsterTemplates); diff --git a/resource/graphics/tyras/cornoth/cnmuseumguard.bgf b/resource/graphics/tyras/cornoth/cnmuseumguard.bgf new file mode 100644 index 0000000000..a984c6c0a2 Binary files /dev/null and b/resource/graphics/tyras/cornoth/cnmuseumguard.bgf differ diff --git a/resource/graphics/tyras/giantdaemon/gskelbody.bgf b/resource/graphics/tyras/giantdaemon/gskelbody.bgf new file mode 100644 index 0000000000..a8718217df Binary files /dev/null and b/resource/graphics/tyras/giantdaemon/gskelbody.bgf differ diff --git a/resource/graphics/tyras/giantdaemon/gskelhed4.bgf b/resource/graphics/tyras/giantdaemon/gskelhed4.bgf new file mode 100644 index 0000000000..7681206ca0 Binary files /dev/null and b/resource/graphics/tyras/giantdaemon/gskelhed4.bgf differ diff --git a/resource/graphics/tyras/makefile b/resource/graphics/tyras/makefile index 53ca21621b..96d2812c48 100644 --- a/resource/graphics/tyras/makefile +++ b/resource/graphics/tyras/makefile @@ -8,7 +8,7 @@ SOURCEDIR = . OUTDIR = $(CLIENTRUNDIR)\resource OUTDIRSUB = ..\$(OUTDIR) -DIRS = cornoth dhelm cnmuseumguard objects grds +DIRS = cornoth dhelm cnmuseumguard objects grds giantdaemon all: @-for %i in (*.bgf) do @$(CP) %i $(OUTDIR) >nul diff --git a/resource/rooms/necarea3.roo b/resource/rooms/necarea3.roo index 3a68091fe2..65079fbe97 100644 Binary files a/resource/rooms/necarea3.roo and b/resource/rooms/necarea3.roo differ diff --git a/resource/rooms/necarea6.roo b/resource/rooms/necarea6.roo new file mode 100644 index 0000000000..d06c37df4a Binary files /dev/null and b/resource/rooms/necarea6.roo differ