diff --git a/_maps/map_files/generic/chapel.dmm b/_maps/map_files/generic/chapel.dmm new file mode 100644 index 00000000000..6bf7cb9bd63 --- /dev/null +++ b/_maps/map_files/generic/chapel.dmm @@ -0,0 +1,348 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space, +/area/space) +"ab" = ( +/turf/closed/indestructible/riveted, +/area/hades) +"ac" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/hades, +/area/hades) +"ad" = ( +/obj/structure/piano, +/turf/open/floor/plasteel/hades, +/area/hades) +"ae" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/plasteel/hades, +/area/hades) +"af" = ( +/turf/open/floor/plasteel/hades, +/area/hades) +"ag" = ( +/obj/structure/window/fulltile, +/turf/open/floor/plasteel/hades, +/area/hades) +"ah" = ( +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/hades, +/area/hades) +"ai" = ( +/obj/effect/gibspawner/human, +/mob/living/simple_animal/hostile/hadesacolyte, +/turf/open/floor/plasteel/hades, +/area/hades) +"aj" = ( +/mob/living/simple_animal/hostile/hadesacolyte, +/turf/open/floor/plasteel/hades, +/area/hades) +"ak" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/fulltile, +/turf/open/floor/plasteel/hades, +/area/hades) +"al" = ( +/obj/structure/table/reinforced/brass, +/obj/item/candle/infinite, +/turf/open/floor/plasteel/hades, +/area/hades) +"am" = ( +/obj/structure/table/reinforced/brass, +/obj/item/candle/infinite, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel/hades, +/area/hades) +"an" = ( +/obj/structure/table/reinforced/brass, +/turf/open/floor/plasteel/hades, +/area/hades) +"ao" = ( +/obj/structure/table/reinforced/brass, +/obj/item/candle/infinite, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/hades, +/area/hades) +"ap" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/fulltile, +/turf/open/floor/plasteel/hades, +/area/hades) +"aq" = ( +/turf/open/floor/carpet, +/area/hades) +"ar" = ( +/obj/structure/chair/wood/normal{ + icon_state = "wooden_chair"; + dir = 1 + }, +/mob/living/simple_animal/hostile/hadesacolyte, +/turf/open/floor/plasteel/hades, +/area/hades) +"as" = ( +/obj/structure/chair/wood/normal{ + icon_state = "wooden_chair"; + dir = 1 + }, +/turf/open/floor/plasteel/hades, +/area/hades) +"at" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/carpet, +/area/hades) +"au" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/hades) +"av" = ( +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/hades) +"aw" = ( +/obj/structure/table/wood, +/obj/item/trash/candle, +/turf/open/floor/carpet, +/area/hades) +"ax" = ( +/obj/structure/flora/grass/green, +/turf/open/floor/grass, +/area/hades) +"ay" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/hades) +"az" = ( +/obj/structure/flora/ausbushes/palebush, +/turf/open/floor/grass, +/area/hades) +"aA" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/hades) +"aB" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/carpet, +/area/hades) +"aC" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/carpet, +/area/hades) +"aD" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/carpet, +/area/hades) +"aE" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/carpet, +/area/hades) +"aF" = ( +/obj/structure/kitchenspike, +/turf/open/floor/mineral/diamond, +/area/hades) +"aG" = ( +/mob/living/simple_animal/hostile/hadesacolyte, +/turf/open/floor/mineral/gold, +/area/hades) +"aH" = ( +/turf/open/floor/mineral/gold, +/area/hades) +"aI" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/hades) +"aJ" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/hades) +"aK" = ( +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/grass, +/area/hades) +"aL" = ( +/obj/structure/flora/ausbushes/genericbush, +/turf/open/floor/grass, +/area/hades) +"aM" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/carpet, +/area/hades) +"aN" = ( +/obj/structure/closet/cabinet, +/turf/open/floor/carpet, +/area/hades) +"aO" = ( +/obj/structure/table/wood, +/obj/item/weapon/paper/hades_instructions, +/turf/open/floor/carpet, +/area/hades) +"aP" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/hades) +"aQ" = ( +/obj/structure/bed, +/obj/item/weapon/bedsheet/black, +/turf/open/floor/carpet, +/area/hades) +"aR" = ( +/mob/living/simple_animal/hostile/hadesacolyte, +/turf/open/floor/carpet, +/area/hades) +"aS" = ( +/obj/structure/table/wood, +/obj/item/weapon/storage/box/matches, +/turf/open/floor/carpet, +/area/hades) +"aT" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plasteel, +/area/hades) +"aU" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/plasteel/hades, +/area/hades) +"aV" = ( +/obj/structure/table/wood, +/obj/item/weapon/lipstick, +/turf/open/floor/carpet, +/area/hades) +"aW" = ( +/obj/structure/table/wood, +/obj/item/weapon/storage/fancy/candle_box, +/turf/open/floor/carpet, +/area/hades) +"aX" = ( +/obj/structure/chair/wood/normal{ + icon_state = "wooden_chair"; + dir = 4 + }, +/turf/open/floor/carpet, +/area/hades) +"aY" = ( +/obj/structure/chair/wood/normal{ + icon_state = "wooden_chair"; + dir = 8 + }, +/turf/open/floor/carpet, +/area/hades) +"aZ" = ( +/obj/structure/table/wood, +/obj/item/weapon/storage/crayons, +/turf/open/floor/carpet, +/area/hades) +"ba" = ( +/obj/structure/table/wood, +/obj/item/weapon/razor, +/turf/open/floor/carpet, +/area/hades) +"bb" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/carpet, +/area/hades) +"bc" = ( +/obj/structure/chair/hades, +/turf/open/floor/mineral/diamond, +/area/hades) +"bd" = ( +/obj/machinery/vending/cola, +/turf/open/floor/carpet, +/area/hades) +"be" = ( +/obj/machinery/vending/snack, +/turf/open/floor/carpet, +/area/hades) +"bf" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/carpet, +/area/hades) +"bg" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/carpet, +/area/hades) +"bh" = ( +/obj/structure/table/wood, +/obj/item/weapon/storage/box/donkpockets, +/turf/open/floor/carpet, +/area/hades) +"bi" = ( +/obj/machinery/chem_dispenser/drinks, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/hades) +"bj" = ( +/obj/structure/chair/wood/normal, +/mob/living/simple_animal/hostile/hadesacolyte, +/turf/open/floor/carpet, +/area/hades) +"bk" = ( +/obj/structure/table/wood, +/obj/item/weapon/kitchen/fork, +/turf/open/floor/carpet, +/area/hades) +"bl" = ( +/obj/structure/chair/wood/normal{ + icon_state = "wooden_chair"; + dir = 1 + }, +/turf/open/floor/carpet, +/area/hades) +"bm" = ( +/obj/structure/table/wood, +/obj/item/weapon/storage/box/drinkingglasses, +/turf/open/floor/carpet, +/area/hades) + +( +1, +1, +1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaabacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaabadaeafafafafaeafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababagahahaiafafajahahagababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabacacacakalamananananaoalapacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabaeafafafafajaqaqaqaqajafafafafaeabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafafafaeafafaqaqaqaqafafaeafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafarasasasafaqataqaqafarasasarafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafafafafafafaqaqaqaqafafafafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafasasarasafaqaqaqaqafasarasasafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafafaeafafafaqataqaqafafaeafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafasasasarafaqaqaqaqafasasarasafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafafafaeafafaqauaqaqafafafafaeafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabafarasasasafaqaqataqafasarasasafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabaeafafafafafaqaqaqaqafafafafafaeabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabababababababaqaqaqaqababababababababababababababababababababababaa +aaaaabavavavavavabawaqaqaqabaxayazaAaxabaBaBaCaCaDaEabaFaGaHaHaHaGaFabaa +aaaaabaqaqaqaqaqabaIaqaqaqabaJaKaLaAayabaMaqaqaqaqaMabafafafaHafafafabaa +aaaaabaNaqaqaqaNabaOaqaqaqabaPayaJaxazabaMaqaqaqaqaCabafafafaHafafafabaa +aaaaabaQaRaqaqaQabaSaqaqaqabaTaTaTaTaTabaEaqaRaRaqaBaUafafafaHafafafabaa +aaaaabaVaqaqaqaOabaWaqaqaqabaXaqaqaqaYabaEaqaRaRaqaBabafafafaHafafafabaa +aaaaabaQaqaqaqaQabaZaqaqaqabaXaqaqaqaYabaEaqaqaqaqaCabafafafaHafafafabaa +aaaaabaIaqaqaRbaabaIaqaqaqbbaqaqaqaqaqabababbbababababaFaGaHbcaHaGaFabaa +aaaaabaQaRaqaqaQabaqaqaqaqabaqaqaqaqaqabaEaBaqaCaBaEabafafafaHafafafabaa +aaaaabababbbababababababababaqaqaqaqaqabaEaqaqaqaRaBabafafafaHafafafabaa +aaaaabaqaqaqaqbdbebfbgbhbiabaXaqaqaRaYabaBaqaqaqaqaEabafafafaHafafafabaa +aaaaabaqbjbjaqaqaqaqaqaqaqabaXaqaqaqaYabaCaqaqaqaqaMabafafafaHafafafabaa +aaaaabaXbkaIaYaqaqaqaqaqaqbbaqaqaqaqaqbbaqaqaRaqaqaEabafafafaHafafafabaa +aaaaabaqblblaqaqaqbmaIaIaOabaqaqaqaqaqabaMaMaBaDaCaMabaFaGaHaHaHaGaFabaa +aaaaabababababababababababababababababababababababababababababababababaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index 58314f4fbae..967d7bea649 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -23,21 +23,7 @@ height = bounds[MAP_MAXY] return bounds -/datum/map_template/proc/load(turf/T, centered = FALSE) - if(centered) - T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z) - if(!T) - return - if(T.x+width > world.maxx) - return - if(T.y+height > world.maxy) - return - - var/list/bounds = maploader.load_map(get_file(), T.x, T.y, T.z, cropMap=TRUE) - if(!bounds) - return 0 - - //initialize things that are normally initialized after map load +/proc/initTemplateBounds(var/list/bounds) var/list/obj/machinery/atmospherics/atmos_machines = list() var/list/obj/structure/cable/cables = list() var/list/atom/atoms = list() @@ -58,6 +44,23 @@ SSmachine.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) +/datum/map_template/proc/load(turf/T, centered = FALSE) + if(centered) + T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z) + if(!T) + return + if(T.x+width > world.maxx) + return + if(T.y+height > world.maxy) + return + + var/list/bounds = maploader.load_map(get_file(), T.x, T.y, T.z, cropMap=TRUE) + if(!bounds) + return 0 + + //initialize things that are normally initialized after map load + initTemplateBounds(bounds) + log_game("[name] loaded at at [T.x],[T.y],[T.z]") return 1 diff --git a/code/game/gamemodes/miniantags/hades/hades.dm b/code/game/gamemodes/miniantags/hades/hades.dm index da25b58168a..d9882cf21b4 100644 --- a/code/game/gamemodes/miniantags/hades/hades.dm +++ b/code/game/gamemodes/miniantags/hades/hades.dm @@ -43,11 +43,14 @@ var/currentState = STATE_JUDGE var/rageLevel = 0 + var/maxWrathTimer = 150 + var/lastWrathTimer = 0 + var/list/validSins = list("Greed","Gluttony","Pride","Lust","Envy","Sloth","Wrath") var/lastsinPerson = 0 var/sinPersonTime = 300 var/lastFlee = 0 - var/fleeTimer = 150 + var/fleeTimer = 30 var/fakesinPersonChance = 60 var/list/sinPersonsayings = list("You revel in only your own greed.",\ "There is nothing but your absolution.",\ @@ -79,6 +82,14 @@ /mob/living/simple_animal/hostile/hades/New() ..() + //helper_datums/map_template.dmm make this a generic function + + var/list/bounds = maploader.load_map('_maps/map_files/generic/chapel.dmm') + initTemplateBounds(bounds) + log_game("Chapel of Sin loaded by [src] spawning.") + + // + sinLightning = new/obj/effect/proc_holder/spell/targeted/lightning(src) sinLightning.charge_max = 1 @@ -123,6 +134,18 @@ SpinAnimation(0,0) explosion(get_turf(src), 0, 2, 4, 6, flame_range = 6) ..() + var/area/A = locate(/area/hades) in world + if(A) + var/turf/T = get_turf(locate(/obj/effect/landmark/event_spawn) in A) + if(T) + src.visible_message("[src]'s Staff is flung free as their body explodes.") + var/obj/structure/ladder/unbreakable/hades/churchLadder = new/obj/structure/ladder/unbreakable/hades(T) + var/obj/structure/ladder/unbreakable/hades/bodyLadder = new/obj/structure/ladder/unbreakable/hades(get_turf(src)) + var/obj/item/weapon/hades_staff/HS = new/obj/item/weapon/hades_staff(get_turf(src)) + HS.throw_at_fast(pick(orange(src,7)),10,1) + churchLadder.up = bodyLadder + bodyLadder.down = churchLadder + qdel(src) /mob/living/simple_animal/hostile/hades/attackby(obj/item/I, mob/user, params) ..() @@ -210,8 +233,9 @@ if(..() && !isDoingDeath) // appropriately check if we're alive now we leave a corpse if(health > maxHealth/4 && !isFleeing) if(rageLevel > 50) + lastWrathTimer = world.time currentState = STATE_WRATH - else if(rageLevel <= 0) + else currentState = STATE_JUDGE else if(world.time > lastFlee + fleeTimer) @@ -236,12 +260,16 @@ A.gib() if(currentState == STATE_WRATH) // we have been enraged. - rageLevel -= 0.25 // rage phase starts at 50, meaning roughly 20s of rage. + if(world.time > lastWrathTimer + maxWrathTimer) + rageLevel = 0 // wind down if we're wrathful too long. + rageLevel -= 1 // rage phase starts at 50, meaning roughly 20s of rage. if(currentAcolytes.len == 0) src.say("Rise, Servants. AID YOUR MASTER.") playsound(get_turf(src), 'sound/magic/CastSummon.ogg', 100, 1) for(var/i in 1 to 5) - currentAcolytes += new/mob/living/simple_animal/hostile/hadesacolyte(get_turf(src)) + var/mob/living/simple_animal/hostile/hadesacolyte/HA = new/mob/living/simple_animal/hostile/hadesacolyte(get_turf(src)) + HA.master = src + currentAcolytes += HA if(rageLevel >= 100) rageLevel = 50 var/list/overboardSayings = list("Ashes! It will all be ashes!","I will bring about the apocolypse!",\ @@ -255,6 +283,7 @@ for(var/mob/living/A in nearby) if(A.ckey) slashCount++ + A.Beam(src,"n_beam",'icons/effects/beam.dmi',10) spawn(slashCount+3) loc = get_turf(A) sinShed(StartLoc) @@ -322,98 +351,144 @@ src.say("Your sin, [sinPerson], is Greed.") if(prob(50)) src.say("I will indulge your sin, [sinPerson].") - var/list/greed = list(/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/diamond) - for(var/i in 1 to 10) - var/greed_type = pick(greed) - new greed_type(get_turf(sinPerson)) + sin_Greed(sinPerson, TRUE) else src.say("Your sin will be punished, [sinPerson]!") - var/mob/living/M = sinPerson.change_mob_type(/mob/living/simple_animal/cockroach,get_turf(sinPerson),"Greedroach",1) - M.AddSpell(new/obj/effect/proc_holder/spell/targeted/mind_transfer) + sin_Greed(sinPerson, FALSE) if("Gluttony") src.say("Your sin, [sinPerson], is Gluttony.") if(prob(50)) src.say("I will indulge your sin, [sinPerson].") - var/list/allTypes = list() - for(var/A in typesof(/obj/item/weapon/reagent_containers/food/snacks)) - var/obj/item/weapon/reagent_containers/food/snacks/O = A - if(initial(O.cooked_type)) - allTypes += A - for(var/i in 1 to 10) - var/greed_type = pick(allTypes) - new greed_type(get_turf(sinPerson)) + sin_Gluttony(sinPerson,TRUE) else src.say("Your sin will be punished, [sinPerson]!") - sinPerson.reagents.add_reagent("nutriment",1000) + sin_Gluttony(sinPerson,FALSE) if("Pride") src.say("Your sin, [sinPerson], is Pride.") if(prob(50)) src.say("I will indulge your sin, [sinPerson].") - var/obj/item/weapon/twohanded/sin_pride/good = new/obj/item/weapon/twohanded/sin_pride(get_turf(sinPerson)) - good.pride_direction = FALSE + sin_Pride(sinPerson,TRUE) else src.say("Your sin will be punished, [sinPerson]!") - var/obj/item/weapon/twohanded/sin_pride/bad = new/obj/item/weapon/twohanded/sin_pride(get_turf(sinPerson)) - bad.pride_direction = TRUE + sin_Pride(sinPerson,FALSE) if("Lust") src.say("Your sin, [sinPerson], is Lust.") if(prob(50)) src.say("I will indulge your sin, [sinPerson].") - var/obj/item/lovestone/good = new/obj/item/lovestone(get_turf(sinPerson)) - good.lust_direction = FALSE + sin_Lust(sinPerson,TRUE) else src.say("Your sin will be punished, [sinPerson]!") - var/obj/item/lovestone/bad = new/obj/item/lovestone(get_turf(sinPerson)) - bad.lust_direction = TRUE + sin_Lust(sinPerson,TRUE) if("Envy") src.say("Your sin, [sinPerson], is Envy.") if(prob(50)) src.say("I will indulge your sin, [sinPerson].") - for(var/mob/living/carbon/human/H in player_list) // name lottery - if(H == sinPerson) - continue - if(prob(25)) - spawn(10) - sinPerson.name = H.name - sinPerson.real_name = H.real_name - var/datum/dna/lottery = H.dna - lottery.transfer_identity(sinPerson, transfer_SE=1) - sinPerson.updateappearance(mutcolor_update=1) - sinPerson.domutcheck() + sin_Envy(sinPerson,TRUE) else src.say("Your sin will be punished, [sinPerson]!") - var/sinPersonspecies = pick(species_list) - var/newtype = species_list[sinPersonspecies] - sinPerson.set_species(newtype) + sin_Envy(sinPerson,FALSE) if("Sloth") src.say("Your sin, [sinPerson], is Sloth.") if(prob(50)) src.say("I will indulge your sin, [sinPerson].") - sinPerson.drowsyness += 1000 + sin_Sloth(sinPerson,TRUE) else src.say("Your sin will be punished, [sinPerson]!") - sinPerson.reagents.add_reagent("frostoil", 50) + sin_Sloth(sinPerson,FALSE) if("Wrath") src.say("Your sin, [sinPerson], is Wrath.") if(prob(50)) src.say("I will indulge your sin, [sinPerson].") - sinPerson.change_mob_type(/mob/living/simple_animal/slaughter,get_turf(sinPerson),"Wrath Demon",1) + sin_Wrath(sinPerson,TRUE) else src.say("Your sin will be punished, [sinPerson]!") - sinPerson.reagents.add_reagent("lexorin", 100) - sinPerson.reagents.add_reagent("mindbreaker", 100) + sin_Wrath(sinPerson,FALSE) ///Sin related things +//global Sin procs, shared between staff and pope + +/proc/sin_Greed(var/mob/living/carbon/human/sinPerson, var/isIndulged) + if(isIndulged) + var/list/greed = list(/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/diamond) + for(var/i in 1 to 10) + var/greed_type = pick(greed) + new greed_type(get_turf(sinPerson)) + else + var/mob/living/M = sinPerson.change_mob_type(/mob/living/simple_animal/cockroach,get_turf(sinPerson),"Greedroach",1) + M.AddSpell(new/obj/effect/proc_holder/spell/targeted/mind_transfer) + +/proc/sin_Gluttony(var/mob/living/carbon/human/sinPerson, var/isIndulged) + if(isIndulged) + var/list/allTypes = list() + for(var/A in typesof(/obj/item/weapon/reagent_containers/food/snacks)) + var/obj/item/weapon/reagent_containers/food/snacks/O = A + if(initial(O.cooked_type)) + allTypes += A + for(var/i in 1 to 10) + var/greed_type = pick(allTypes) + new greed_type(get_turf(sinPerson)) + else + sinPerson.reagents.add_reagent("nutriment",1000) + +/proc/sin_Pride(var/mob/living/carbon/human/sinPerson, var/isIndulged) + if(isIndulged) + var/obj/item/weapon/twohanded/sin_pride/good = new/obj/item/weapon/twohanded/sin_pride(get_turf(sinPerson)) + good.name = "Indulged [good.name]" + good.pride_direction = FALSE + else + var/obj/item/weapon/twohanded/sin_pride/bad = new/obj/item/weapon/twohanded/sin_pride(get_turf(sinPerson)) + bad.name = "Punished [bad.name]" + bad.pride_direction = TRUE + +/proc/sin_Lust(var/mob/living/carbon/human/sinPerson, var/isIndulged) + if(isIndulged) + var/obj/item/lovestone/good = new/obj/item/lovestone(get_turf(sinPerson)) + good.name = "Indulged [good.name]" + good.lust_direction = FALSE + else + var/obj/item/lovestone/bad = new/obj/item/lovestone(get_turf(sinPerson)) + bad.name = "Punished [bad.name]" + bad.lust_direction = TRUE + +/proc/sin_Envy(var/mob/living/carbon/human/sinPerson, var/isIndulged) + if(isIndulged) + for(var/mob/living/carbon/human/H in player_list) // name lottery + if(H == sinPerson) + continue + if(prob(25)) + spawn(10) + sinPerson.name = H.name + sinPerson.real_name = H.real_name + var/datum/dna/lottery = H.dna + lottery.transfer_identity(sinPerson, transfer_SE=1) + sinPerson.updateappearance(mutcolor_update=1) + sinPerson.domutcheck() + else + var/sinPersonspecies = pick(species_list) + var/newtype = species_list[sinPersonspecies] + sinPerson.set_species(newtype) + +/proc/sin_Sloth(var/mob/living/carbon/human/sinPerson, var/isIndulged) + if(isIndulged) + sinPerson.drowsyness += 1000 + else + sinPerson.reagents.add_reagent("frostoil", 50) + +/proc/sin_Wrath(var/mob/living/carbon/human/sinPerson, var/isIndulged) + if(isIndulged) + sinPerson.change_mob_type(/mob/living/simple_animal/slaughter,get_turf(sinPerson),"Wrath Demon",1) + else + sinPerson.reagents.add_reagent("lexorin", 100) + sinPerson.reagents.add_reagent("mindbreaker", 100) + /obj/effect/overlay/temp/hadesFlick name = "transdimensional waste" icon = 'icons/mob/mob.dmi' icon_state = "liquify" duration = 15 - - /obj/effect/timestop/hades // custom timeslip to make him immune name = "Frozen Time" desc = "Time has slowed to a halt." @@ -503,9 +578,9 @@ /mob/living/simple_animal/hostile/hadesacolyte name = "Acolyte of Hades" desc = "Darkness seethes from their every pore." - icon_state = "faithless" - icon_living = "faithless" - icon_dead = "faithless_dead" + icon_state = "hades_acolyte" + icon_living = "hades_acolyte" + icon_dead = "hades_acolyte_dead" speak_chance = 0 turns_per_move = 5 response_help = "trembles in fear of" @@ -525,6 +600,17 @@ del_on_death = 0 faction = list("hades") + var/mob/living/simple_animal/hostile/hades/master + +/mob/living/simple_animal/hostile/hadesacolyte/Life() + if(..()) + if(master) + if(get_dist(src,master) > 5) + src.visible_message("[src] twists and distorts, before vanishing in a snap.") + src.forceMove(get_turf(master)) + + + #undef STATE_JUDGE #undef STATE_WRATH #undef STATE_FLEE \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/hades/hades_chapel.dm b/code/game/gamemodes/miniantags/hades/hades_chapel.dm new file mode 100644 index 00000000000..3f506c1c496 --- /dev/null +++ b/code/game/gamemodes/miniantags/hades/hades_chapel.dm @@ -0,0 +1,166 @@ +/area/hades + name = "Chapel of Sin" + icon_state = "yellow" + requires_power = 0 + has_gravity = 1 + +/turf/open/floor/plasteel/hades + name = "Sin-touched Floor" + icon_state = "cult" + +/obj/structure/chair/hades + name = "Cross of Hades" + desc = "An inverted cross, with straps on it to support the weight of a living being." + icon_state = "chair_hades" + var/list/watchedSpikes = list() + +/obj/structure/chair/hades/New() + ..() + flags |= NODECONSTRUCT + for(var/obj/structure/kitchenspike/KS in range(12)) + watchedSpikes += KS + +/obj/structure/chair/hades/proc/considerReady() + //buckled_mobs seems to work inconsistently, so we're doing some custom searching here. + if(!buckled_mobs) + return FALSE + if(!buckled_mobs.len) + return FALSE + for(var/obj/structure/kitchenspike/KS in watchedSpikes) + var/mob/living/M = locate(/mob/living) in get_turf(KS) + if(!M) + return FALSE + return TRUE + +/obj/structure/chair/hades/proc/completeRitual() + for(var/obj/structure/kitchenspike/KS in watchedSpikes) + var/mob/living/M = locate(/mob/living) in get_turf(KS) + M.gib() + playsound(get_turf(src), 'sound/effects/pope_entry.ogg', 100, 1) + spawn(100) + playsound(get_turf(src), 'sound/effects/hyperspace_end.ogg', 100, 1) + new/obj/item/weapon/hades_staff/imbued(get_turf(src)) + src.visible_message("[src] shatters into a thousand shards, a staff falling from it.") + qdel(src) + +/obj/structure/chair/hades/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(istype(W, /obj/item/weapon/hades_staff)) + src.visible_message("[user] inserts the [W] into the [src], giving it a quick turn.") + if(considerReady()) + qdel(W) + src.visible_message("[src] shudders, the sound of moving gears arising...") + for(var/mob/living/M in buckled_mobs) + M.gib() + for(var/i in 1 to 4) + spawn(i*10) + playsound(get_turf(src), 'sound/effects/clang.ogg', 100, 1) + spawn(50) + src.visible_message("[src] begins to lower into the ground...") + icon_state = "chair_hades_slide" + addtimer(src, "completeRitual", 50, FALSE) + else + src.visible_message("[src] clunks, the sound of grinding gears arising. Nothing happens.") + +/obj/structure/ladder/unbreakable/hades + name = "Dimensional Rift" + desc = "Where does it lead?" + icon = 'icons/mob/EvilPope.dmi' + icon_state = "popedeath" + anchored = TRUE + +/obj/structure/ladder/unbreakable/hades/update_icon() + return + +/obj/item/weapon/paper/hades_instructions + name = "paper- 'Hastily Scrawled Letter'" + info = "The Master has instructed us to collect corpses for the ritual, and told us to deposity them in the Ritual Room, behind a bookcase in the library. The Master has locked the device to only work with his key, so no more accidents happen." + +/obj/item/weapon/hades_staff + name = "Staff of Hades" + desc = "A large, dark staff, with a set of key-like prongs on the end." + icon_state = "staffofchange" + icon = 'icons/obj/guns/magic.dmi' + item_state = "staffofchange" + slot_flags = SLOT_BELT | SLOT_BACK + force = 40 + throwforce = 10 + w_class = 3 + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("slapped", "shattered", "blasphemed", "smashed", "whacked", "crushed", "hammered") + block_chance = 50 + +/obj/item/weapon/hades_staff/imbued + name = "Imbued Staff of Hades" + desc = " Bestowed with the power of wayward souls, this Staff allows the wielder to judge a target." + var/lastJudge = 0 + var/judgeCooldown = 150 + +/obj/item/weapon/hades_staff/imbued/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) + if(!istype(M)) + return ..() + + if(world.time > lastJudge + judgeCooldown) + var/mob/living/sinPerson = M + lastJudge = world.time + var/sinPersonchoice = pick("Greed","Gluttony","Pride","Lust","Envy","Sloth","Wrath") + switch(sinPersonchoice) + if("Greed") + src.say("Your sin, [sinPerson], is Greed.") + if(prob(50)) + src.say("I will indulge your sin, [sinPerson].") + sin_Greed(sinPerson, TRUE) + else + src.say("Your sin will be punished, [sinPerson]!") + sin_Greed(sinPerson, FALSE) + if("Gluttony") + src.say("Your sin, [sinPerson], is Gluttony.") + if(prob(50)) + src.say("I will indulge your sin, [sinPerson].") + sin_Gluttony(sinPerson,TRUE) + else + src.say("Your sin will be punished, [sinPerson]!") + sin_Gluttony(sinPerson,FALSE) + if("Pride") + src.say("Your sin, [sinPerson], is Pride.") + if(prob(50)) + src.say("I will indulge your sin, [sinPerson].") + sin_Pride(sinPerson,TRUE) + else + src.say("Your sin will be punished, [sinPerson]!") + sin_Pride(sinPerson,FALSE) + if("Lust") + src.say("Your sin, [sinPerson], is Lust.") + if(prob(50)) + src.say("I will indulge your sin, [sinPerson].") + sin_Lust(sinPerson,TRUE) + else + src.say("Your sin will be punished, [sinPerson]!") + sin_Lust(sinPerson,TRUE) + if("Envy") + src.say("Your sin, [sinPerson], is Envy.") + if(prob(50)) + src.say("I will indulge your sin, [sinPerson].") + sin_Envy(sinPerson,TRUE) + else + src.say("Your sin will be punished, [sinPerson]!") + sin_Envy(sinPerson,FALSE) + if("Sloth") + src.say("Your sin, [sinPerson], is Sloth.") + if(prob(50)) + src.say("I will indulge your sin, [sinPerson].") + sin_Sloth(sinPerson,TRUE) + else + src.say("Your sin will be punished, [sinPerson]!") + sin_Sloth(sinPerson,FALSE) + if("Wrath") + src.say("Your sin, [sinPerson], is Wrath.") + if(prob(50)) + src.say("I will indulge your sin, [sinPerson].") + sin_Wrath(sinPerson,TRUE) + else + src.say("Your sin will be punished, [sinPerson]!") + sin_Wrath(sinPerson,FALSE) + else + ..() + user << "The [src] is still recharging." diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 0b818e9ced6..3de0203b710 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index 7a0ccdcbe56..a16797fa17c 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/tgstation.dme b/tgstation.dme index b84db3190ca..37d6a5bf53f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -364,6 +364,7 @@ #include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" #include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" #include "code\game\gamemodes\miniantags\hades\hades.dm" +#include "code\game\gamemodes\miniantags\hades\hades_chapel.dm" #include "code\game\gamemodes\miniantags\monkey\monkey.dm" #include "code\game\gamemodes\miniantags\morph\morph.dm" #include "code\game\gamemodes\miniantags\sintouched\objectives.dm"