Devil Antag Round 2. (#15794)

* Re-making the branch and PR of demon.  See #15118 for the old PR

* Adds toy demonologist to arcade machine reward list.

* Implemented two suggestions: Pitchfork now has a demonic subtype, to potentially give botanists a normal pitchfork.

Suiciding with signed contract now uses forcesay instead of say.

* Fixes compile errors.
Re factors contracts to be subtypes rather than datums.  <--- incomplete, still need to summon them appropriately.

* buffed infernal power contract to give passive healing
Nerfed magic power contract to not give robeless MM

* Fixes compile errors

* Corrects orientation of true demon sprite

* Begins work on the sNPC for the true demon/ arch-demon

* Added funeral garment sprites.  These will be used in banishment rituals (hopefully)

* Stashing my work so I can move to another computer.

Re-working the true-demon, it will be a carbon rather than a simple mob.

* Revert "Stashing my work so I can move to another computer."

This reverts commit e8b1e032997b7e17af4ad8630bf21d3620195c4e.

* Git exploded for me, so I have to make a new branch with EVERYTHING.  sorry.

* Fixes compile error

* Ghosts can now click on an arch demon to become a slaughter demon

* Begins to convert demons into a carbon rather than simple mob.

* Demons now resurrect if not banished.

* Beepsky now properly tells security chat about the level 666 threat.

* Contracts now work again.

* old spells now get removed properly.

* adding pitchfork sprites

* Adds hud for the true-demon.  Not functional.

* Fixes another error in the demon hud.  Still broken.

* Demons are no longer immortal, demon huds work properly now.  (it's barebones, but it works.)

* Fixes the "Have mortals sign at least # contracts of TYPE" objective

* Fixed typo in banishlore() and updated wrath/envy sintouch objectives.

* Adds huds for demons/sintouched/soulless, however they are currently unused.

* Updates the demon's hud to work with the recent hud changes.

* Cleaned up infernal jaunt, it works a lot better now and is less buggy.

* Revival contracts now actually take your soul.

* Fixes #16513

* Replaces the infinite slaughter demons with infinite imps.  Sprites for imps are still needed.

* Adds sprite for imps.  It's a redder, smaller slaughter demon.

* Fixes lack of icon for pitchforks

* Gives summon wealth a more appropriate icon.

* Fixes small part I forgot to merge.

* Fixes a few bugs with demonic resurrection.  It's still very buggy.

* Derp, my bad, I didn't mean to admin myself on the main server.

* Fixes edge case of demonic resurrection failing.  Debraining the demon is NOT supposed to be an alternative for the banishment ritual.

* Also did not mean to change this config file.

* Fixes another error in type 1 demonic resurrection.  It works properly now.

* Updates employment contract text.

* Fixes type 2 resurrections.
Demonic contracts are once again permanently on fire.

* Replaces toy demonologist with toy demonomicon.  It still works the same, just different icon/name.

* Adds demonomicon and employment cabinet to box/meta/dream/efficiency.

I could not add it to mini/bird due to conflicts.

* Edits ministation and BirdStation to have demonomicons and employment cabinets.

* Fixes spelling error

* Adds burial garments to maps.

* Update photocopier.dm

Fixes the span when inserting items into photocopier

* Fixes disrupt_spells proc

* Makes a lot of changes as reccomended by Remie.

* Fixes a compile error.

* Updates the lawify/loreify to be lists.  Does not compile.

* Fixes compile errors.

* Arch demons no longer regress upon death.
Speaking a demon's truename gives the demon the opportunity to teleport to you.
Makes demonomicon not care about capitalization.

* Fixes startup error.  Demonic summoning now works.  It's very simple, just say their true name.

* Demons now have a tongue.  True demon bodies are deleted upon regression.

* Demons can now be punched.
Demons can no longer resist a fire out, since it does nothing to them.

* true demons show up in player panel.  Hellfire works again.

* Prepares for commit 16940

* Demons are now known as devils.

Still needs testing.

* Oops, didn't commit everything last commit.

* Finishes converting demons to devils.

* Fixes speech for lizards/flymen when they speak a demon's name.

* Update tips.txt

* Changes variable from static to global as per Remie's suggestion.

I disagree with Remie's assessment, as a list that will never change, even between games, seems like it should be static.

* Removes devil summoning.  Hopefully, I'll be able to eventually find a way to implement it satisfactorily, but for now, I'll leave it out.

* Removes carriage returns

* Combined modified icon files

* Fixes #17184

* Imps no longer show up in the end round report.  This is because there can EASILY be 100+ imps if the crew is well armed.

Non-employment filing cabinets no longer take 30 sec to wrench/unwrench.

* The lawyer can actually buy souls back now.  Oops.

* Fixes true/arch devil spritesheet to have correct sprite names.

* Relocates Box's employment cabinet to Law office.

* De-devil-ing someone now removes the devilinfo.
De-devil-ing now returns an error when used on true and arch devils

* Re-factors whiteness code for jumpsuits.

* Merges icons, reverts failed merge of map

* Merges map with CAS decks

* Fixes copying employment contracts

* Derp, fixes compile error.

* Replaces antaghud with customizable vision range for knowledge boon.

* Prevents a runtime if devil is gibbed while ascending.

* Neatens contract code, and removes excess variable from humans.

* Fixes compile errors

* Organizes weakness code slightly.  Adds ability for a species override on weakness.  (Make flypeople take 2x damage from flyswatters for example)

* Removes sixteen erroneous characters from the codebase.

* Removes trailing return

* Makes typeless for loops, removes a runtime, and removes unhelpful comments.
This commit is contained in:
lordpidey
2016-05-08 18:44:27 +01:00
committed by Remie Richards
parent 3dd8f29a9a
commit 24f47b0223
76 changed files with 3307 additions and 1191 deletions
+4 -3
View File
@@ -897,7 +897,7 @@
"arm" = (/obj/structure/cable/cyan{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"arn" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "hop shutter"; name = "HoP Office shutter"},/turf/open/floor/plating,/area/crew_quarters/heads)
"aro" = (/obj/structure/table/wood,/obj/item/weapon/storage/box/silver_ids{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/ids,/turf/open/floor/wood,/area/crew_quarters/heads)
"arp" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = 0; pixel_y = 7},/turf/open/floor/wood,/area/crew_quarters/heads)
"arp" = (/obj/structure/filingcabinet/employment,/turf/open/floor/wood,/area/crew_quarters/heads)
"arq" = (/obj/machinery/vending/cart,/turf/open/floor/wood,/area/crew_quarters/heads)
"arr" = (/obj/machinery/photocopier,/obj/machinery/light{dir = 1},/turf/open/floor/wood,/area/crew_quarters/heads)
"ars" = (/obj/structure/closet/secure_closet/hop,/obj/item/clothing/suit/armor/reactive,/turf/open/floor/wood,/area/crew_quarters/heads)
@@ -1276,7 +1276,7 @@
"ayB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel/black,/area/engine/gravity_generator)
"ayC" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plasteel/black,/area/engine/gravity_generator)
"ayD" = (/obj/effect/landmark{name = "lightsout"},/turf/open/floor/wood,/area/library)
"ayE" = (/obj/structure/table/wood,/obj/item/weapon/storage/pill_bottle/dice,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/open/floor/wood,/area/library)
"ayE" = (/obj/structure/table/wood,/obj/item/weapon/book/codex_gigas,/obj/item/weapon/storage/pill_bottle/dice,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/open/floor/wood,/area/library)
"ayF" = (/obj/effect/landmark/start{name = "Clown"},/turf/open/floor/wood,/area/crew_quarters/theatre)
"ayG" = (/turf/open/floor/wood,/area/crew_quarters/theatre)
"ayH" = (/obj/machinery/camera/autoname{dir = 8},/turf/open/floor/wood,/area/crew_quarters/theatre)
@@ -2951,6 +2951,7 @@
"beO" = (/obj/structure/window/reinforced,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/turf/open/floor/plasteel/black,/area/security/warden)
"beP" = (/obj/structure/table,/obj/item/clothing/glasses/science,/turf/open/floor/plasteel,/area/toxins/misc_lab)
"beQ" = (/obj/effect/decal/cleanable/blood/old,/obj/item/clothing/glasses/sunglasses,/turf/open/floor/wood{icon_state = "wood-broken"},/area/maintenance/fore{name = "Security Maintenance"})
"ZAx" = (/obj/structure/table, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /turf/open/floor/plating,/area/maintenance/asmaint2)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -3126,7 +3127,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaaaaJaaJaaJaaaaaaaaaaaaaaJaaJaaJaaJaPHaPHaPHaPHaPHaPHaRkaRkaPHaaaaaaaVmbbHaVmaaaaayaaaaaaaaaaaaaaBaaaaaaaayaaaaaaaZrbcqbcraZraZraZraZraZrbagazLaAxaAZaNEaAxbcsaAxaAxaAxaAxazLaFsaBRaRZaRZaBRazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLaZxazLazLaaJaaJaaJaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaaaayaaaaaaaaaaPHbctbctaPHaaaaaaaaaaaTaaaaaaaayaaaaaaaaaaaaaaBaaaaaaaayaaaaaaaZrbaSbcubcvbchbchbcwbcxbaSbcyaAxbbyaHGaAxbczaAxbcAaAxaBbaFCaBbaBbbcBbcBaAxbczbcjbcjbcjazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJbcCaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaayaayaayaayaayaPHaQqaQqaPHaayaayaaybcDamzaaBaaBaaBaaBaaBaaBaaBaayaguaguaguaayaZrbaSbcEbcFbcFbcGbcGbcGbcGbcHaDiaDibcIaDibcIaDiaDiaDiaDjbcJaDjaDjaDjaDjaDibcIbcKbcKbcLaTTbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcNaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcObcPbcPbcQbcPbcPbcPbcRbcPbcPbcSaayaaaaPHbcTaQqaVmaaaaayaaaaaaaaaaaaaayaaaaaaaaaaaaaaBaaaaaaaaaaaaaaaaZraZraZrbcUbcUaZrbcVbcWbcXazLaAxaBTaAxaAxaAxbcjbcjbcYbcZazLazLazLazLazLazLazLazLazLazLazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcObcPbcPbcQbcPbcPbcPbcRbcPbcPbcSaayaaaaPHbcTaQqaVmaaaaayaaaaaaaaaaaaaayaaaaaaaaaaaaaaBaaaaaaaaaaaaaaaaZraZraZrbcUbcUaZrbcVbcWbcXazLaAxaBTaAxaAxZAxbcjbcjbcYbcZazLazLazLazLazLazLazLazLazLazLazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcObdabdbbdcbddbddbddbddbddbddbddbcQaVmaVmaVmaQqaQqaVmaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaaaaaaaaaaaaaaaaaJaaJaZrbdebdeaZraZraZraZrazLazLazLaBRaBRaBRazLazLazLazLazLaaaaayaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdfbdgbdgbdgbdgbdgbdgbdgbdgbdgbdgbdhbdibdjbdkaQqaQqaVmaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaayaaBaayaaaaaaaaaaaaaaaaaJaZrbdebdebdlbdlbdmaZraaJaaJbdnaaaaaaaaaaayaaaaaaaaaaayaaaaayaayaayaayaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdobdpbdqbdqbdrbdrbdrbdrbdrbdrbdrbcQaVmaVmaVmaQqaQqaPHaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaayaaBaayaaaaaaaaaaaaaaaaaJaZrbdsbdebdebdebdtaZraaJaaJaayaayaayaayaayaayaayaayaayaayaayaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaaaaaaaaaaJaaJaaJaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -23727,7 +23727,7 @@
pixel_x = -30;
pixel_y = 0
},
/obj/structure/filingcabinet,
/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"aVu" = (
@@ -45512,6 +45512,7 @@
"bIQ" = (
/obj/structure/cult/tome,
/obj/item/clothing/under/suit_jacket/red,
/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel/cult,
/area/library)
"bIR" = (
@@ -62399,6 +62400,13 @@
dir = 2;
pixel_y = 24
},
/obj/structure/table/wood,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/turf/open/floor/plasteel{
icon_state = "dark"
},
@@ -39741,6 +39741,7 @@
/area/storage/art)
"buT" = (
/obj/structure/cult/tome,
/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel{
icon_state = "cult"
},
@@ -48367,8 +48368,7 @@
name = "Chapel Maintenance"
})
"bKq" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/effect/decal/cleanable/cobweb,
/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"bKr" = (
@@ -57033,9 +57033,13 @@
})
"cay" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/robot_debris{
icon_state = "gib6"
},
/obj/structure/table,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/turf/open/floor/plating,
/area/maintenance/port{
name = "Chapel Maintenance"
@@ -24449,12 +24449,12 @@
/turf/open/floor/wood,
/area/lawoffice)
"aNP" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/machinery/airalarm{
dir = 8;
icon_state = "alarm0";
pixel_x = 24
},
/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"aNQ" = (
@@ -59349,6 +59349,7 @@
pixel_y = 0
},
/obj/item/clothing/under/suit_jacket/red,
/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel{
icon_state = "cult";
dir = 2
@@ -100508,12 +100509,18 @@
},
/area/medical/morgue)
"dfx" = (
/obj/machinery/plantgenes,
/turf/open/floor/plasteel{
dir = 9;
icon_state = "warning"
/obj/structure/window/reinforced{
dir = 4
},
/area/hydroponics)
/obj/structure/table/wood,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/turf/open/floor/plating,
/area/chapel/main)
"dfy" = (
/turf/open/floor/engine/vacuum,
/area/atmos)
@@ -100615,6 +100622,13 @@
},
/turf/open/space,
/area/space)
"dfI" = (
/obj/machinery/plantgenes,
/turf/open/floor/plasteel{
dir = 9;
icon_state = "warning"
},
/area/hydroponics)
(1,1,1) = {"
aaa
@@ -120851,7 +120865,7 @@ cOU
cRS
cRS
cSP
cRS
dfx
cOU
cUb
cOU
@@ -136228,7 +136242,7 @@ bZc
caw
bZc
ccX
dfx
dfI
bVf
cuS
ciC
+13 -2
View File
@@ -3510,6 +3510,7 @@
/obj/item/weapon/folder/red,
/obj/item/weapon/hand_labeler,
/obj/item/clothing/glasses/sunglasses,
/obj/item/weapon/book/codex_gigas,
/turf/open/floor/carpet,
/area/security/brig)
"hn" = (
@@ -10216,7 +10217,7 @@
/area/crew_quarters/bar)
"uW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/filingcabinet/chestdrawer,
/obj/structure/filingcabinet/employment,
/turf/open/floor/plasteel,
/area/crew_quarters/heads{
name = "\improper Job Assignment"
@@ -16130,6 +16131,16 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
"IL" = (
/obj/structure/table,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/turf/open/floor/plating,
/area/hallway/primary/central)
(1,1,1) = {"
aa
@@ -46085,7 +46096,7 @@ nC
jo
bx
bN
bN
IL
bx
ps
rE
@@ -9082,10 +9082,10 @@
/turf/open/floor/carpet,
/area/security/detectives_office)
"arV" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"arW" = (
@@ -20527,6 +20527,7 @@
"aQs" = (
/obj/structure/cult/tome,
/obj/item/clothing/under/suit_jacket/red,
/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel{
icon_state = "cult";
dir = 2
+42
View File
@@ -0,0 +1,42 @@
#define CONTRACT_POWER "power"
#define CONTRACT_WEALTH "wealth"
#define CONTRACT_PRESTIGE "prestige"
#define CONTRACT_MAGIC "magic"
#define CONTRACT_REVIVE "revive"
#define CONTRACT_KNOWLEDGE "knowledge"
#define CONTRACT_UNWILLING "unwilling"
#define BANE_SALT "salt"
#define BANE_LIGHT "light"
#define BANE_IRON "iron"
#define BANE_WHITECLOTHES "whiteclothes"
#define BANE_SILVER "silver"
#define BANE_HARVEST "harvest"
#define BANE_TOOLBOX "toolbox"
#define OBLIGATION_FOOD "food"
#define OBLIGATION_DRINK "drink"
#define OBLIGATION_GREET "greet"
#define OBLIGATION_PRESENCEKNOWN "presenceknown"
#define OBLIGATION_SAYNAME "sayname"
#define OBLIGATION_ANNOUNCEKILL "announcekill"
#define OBLIGATION_ANSWERTONAME "answername"
#define BAN_HURTWOMAN "hurtwoman"
#define BAN_CHAPEL "chapel"
#define BAN_HURTPRIEST "hurtpriest"
#define BAN_AVOIDWATER "avoidwater"
#define BAN_STRIKEUNCONCIOUS "strikeunconcious"
#define BAN_HURTLIZARD "hurtlizard"
#define BAN_HURTANIMAL "hurtanimal"
#define BANISH_WATER "water"
#define BANISH_COFFIN "coffin"
#define BANISH_FORMALDYHIDE "embalm"
#define BANISH_RUNES "runes"
#define BANISH_CANDLES "candles"
#define BANISH_DESTRUCTION "destruction"
#define BANISH_FUNERAL_GARB "funeral"
#define LORE 1
#define LAW 2
+14 -11
View File
@@ -25,14 +25,17 @@
#define DATA_HUD_MEDICAL_ADVANCED 4
#define DATA_HUD_DIAGNOSTIC 5
//antag HUD defines
#define ANTAG_HUD_CULT 6
#define ANTAG_HUD_REV 7
#define ANTAG_HUD_OPS 8
#define ANTAG_HUD_WIZ 9
#define ANTAG_HUD_SHADOW 10
#define ANTAG_HUD_HOG_BLUE 11
#define ANTAG_HUD_HOG_RED 12
#define ANTAG_HUD_TRAITOR 13
#define ANTAG_HUD_NINJA 14
#define ANTAG_HUD_CHANGELING 15
#define ANTAG_HUD_ABDUCTOR 16
#define ANTAG_HUD_CULT 6
#define ANTAG_HUD_REV 7
#define ANTAG_HUD_OPS 8
#define ANTAG_HUD_WIZ 9
#define ANTAG_HUD_SHADOW 10
#define ANTAG_HUD_HOG_BLUE 11
#define ANTAG_HUD_HOG_RED 12
#define ANTAG_HUD_TRAITOR 13
#define ANTAG_HUD_NINJA 14
#define ANTAG_HUD_CHANGELING 15
#define ANTAG_HUD_ABDUCTOR 16
#define ANTAG_HUD_DEVIL 17
#define ANTAG_HUD_SINTOUCHED 18
#define ANTAG_HUD_SOULLESS 19
+2
View File
@@ -24,6 +24,7 @@
#define ROLE_REVENANT "revenant"
#define ROLE_HOG_GOD "hand of god: god"
#define ROLE_HOG_CULTIST "hand of god: cultist"
#define ROLE_DEVIL "devil"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
@@ -48,4 +49,5 @@ var/global/list/special_roles = list(
ROLE_ABDUCTOR = /datum/game_mode/abduction,
ROLE_HOG_GOD = /datum/game_mode/hand_of_god,
ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god,
ROLE_DEVIL = /datum/game_mode/devil
)
+2
View File
@@ -355,6 +355,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
// mob_list.Add(M)
// for(var/mob/living/silicon/hive_mainframe/M in world)
// mob_list.Add(M)
for(var/mob/living/carbon/true_devil/M in sortmob)
moblist.Add(M)
return moblist
//E = MC^2
+75
View File
@@ -0,0 +1,75 @@
/datum/hud/devil/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
..()
var/obj/screen/using
var/obj/screen/inventory/inv_box
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drone_drop
static_inventory += using
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
pull_icon.update_icon(mymob)
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "right hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_r"
inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand
static_inventory += inv_box
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "left hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_l"
inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand
static_inventory += inv_box
using = new /obj/screen/inventory()
using.name = "hand"
using.icon = ui_style
using.icon_state = "swap_1_m"
using.screen_loc = ui_swaphand1
using.layer = 19
static_inventory += using
using = new /obj/screen/inventory()
using.name = "hand"
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand2
using.layer = 19
static_inventory += using
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
zone_select.update_icon(mymob)
lingchemdisplay = new /obj/screen/ling/chems()
/datum/hud/devil/persistant_inventory_update()
if(!mymob)
return
var/mob/living/carbon/true_devil/D = mymob
if(hud_version != HUD_STYLE_NOHUD)
if(D.r_hand)
D.r_hand.screen_loc = ui_rhand
D.client.screen += D.r_hand
if(D.l_hand)
D.l_hand.screen_loc = ui_lhand
D.client.screen += D.l_hand
else
if(D.r_hand)
D.r_hand.screen_loc = null
if(D.l_hand)
D.l_hand.screen_loc = null
/mob/living/carbon/true_devil/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/devil(src, ui_style2icon(client.prefs.UI_style))
+1
View File
@@ -262,6 +262,7 @@ var/record_id_num = 1001
L.fields["species"] = H.dna.species.type
L.fields["features"] = H.dna.features
L.fields["image"] = image
L.fields["reference"] = H
locked += L
return
+3
View File
@@ -18,6 +18,9 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag(),\
ANTAG_HUD_SINTOUCHED = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),\
)
/datum/atom_hud
+81 -2
View File
@@ -57,9 +57,13 @@
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
var/datum/gang/gang_datum //Which gang this mind belongs to, if any
var/datum/devilinfo/devilinfo //Information about the devil, if any.
var/damnation_type = 0
var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
/datum/mind/New(var/key)
src.key = key
soulOwner = src
/datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0)
@@ -539,6 +543,24 @@
sections["monkey"] = text
/** devil ***/
text = "devil"
if(ticker.mode.config_tag == "devil")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if(src in ticker.mode.devils)
text += "<b>DEVIL</b>|sintouched|<a href='?src=\ref[src];devil=clear'>human</a>"
else if(src in ticker.mode.sintouched)
text += "devil|<b>SINTOUCHED</b>|<a href='?src=\ref[src];devil=clear'>human</a>"
else
text += "<a href='?src=\ref[src];devil=devil'>devil</a>|<a href='?src=\ref[src];devil=sintouched'>sintouched</a>|<b>HUMAN</b>"
if(current && current.client && (ROLE_DEVIL in current.client.prefs.be_special))
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
sections["devil"] = text
/** SILICON ***/
@@ -1163,6 +1185,45 @@
message_admins("[key_name_admin(usr)] has thrall'ed [current].")
log_admin("[key_name(usr)] has thrall'ed [current].")
else if(href_list["devil"])
switch(href_list["devil"])
if("clear")
if(src in ticker.mode.devils)
if(istype(current,/mob/living/carbon/true_devil/))
usr << "<span class='warning'>This cannot be used on true or arch-devils.</span>"
else
ticker.mode.devils -= src
special_role = null
current << "<span class='userdanger'>Your infernal link has been severed! You are no longer a devil!</span>"
RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt)
RemoveSpell(/obj/effect/proc_holder/spell/dumbfire/fireball/hellish)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_contract)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_pitchfork)
message_admins("[key_name_admin(usr)] has de-devil'ed [current].")
devilinfo = null
log_admin("[key_name(usr)] has de-devil'ed [current].")
else if(src in ticker.mode.sintouched)
ticker.mode.sintouched -= src
message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].")
log_admin("[key_name(usr)] has de-sintouch'ed [current].")
if("devil")
if(!ishuman(current))
usr << "<span class='warning'>This only works on humans!</span>"
return
ticker.mode.devils += src
special_role = "devil"
ticker.mode.finalize_devil(src)
announceDevilLaws()
if("sintouched")
if(ishuman(current))
ticker.mode.sintouched += src
var/mob/living/carbon/human/H = current
H.influenceSin()
message_admins("[key_name_admin(usr)] has sintouch'ed [current].")
else
usr << "<span class='warning'>This only works on humans!</span>"
return
else if(href_list["abductor"])
switch(href_list["abductor"])
if("clear")
@@ -1569,7 +1630,6 @@
ticker.mode.greet_hog_follower(src,colour)
ticker.mode.update_hog_icons_added(src, colour)
/datum/mind/proc/make_Handofgod_god(colour)
switch(colour)
if("red")
@@ -1611,6 +1671,25 @@
var/obj/effect/proc_holder/spell/S = X
S.action.Grant(new_character)
/datum/mind/proc/disrupt_spells(delay, list/exceptions = New())
for(var/X in spell_list)
var/obj/effect/proc_holder/spell/S = X
for(var/type in exceptions)
if(istype(S, type))
continue
S.charge_counter = delay
spawn(0)
S.start_recharge()
/datum/mind/proc/get_ghost(even_if_they_cant_reenter)
for(var/mob/dead/observer/G in dead_mob_list)
if(G.mind == src)
if(G.can_reenter_corpse || even_if_they_cant_reenter)
return G
break
/mob/proc/sync_mind()
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
mind.active = 1 //indicates that the mind is currently synced with a client
@@ -1721,4 +1800,4 @@
/mob/living/simple_animal/hostile/construct/mind_initialize()
..()
mind.assigned_role = "[initial(name)]"
mind.special_role = "Cultist"
mind.special_role = "Cultist"
+19
View File
@@ -1328,6 +1328,25 @@ var/list/teleportlocs = list()
icon_state = "tcomsatlounge"
// Hell
/area/hell
name = "Hell Lobby"
//icon = "ICON FILENAME"
//icon_state = "NAME OF ICON"
requires_power = 0
music = "music/music.ogg"
/area/hell/trial1
name = "Hell Trial1"
//icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
/area/hell/trial1
name = "Hell Trial2"
//icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
/area/hell/trial1
name = "Hell Trial3"
//icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
// Away Missions
/area/awaymission
+40
View File
@@ -0,0 +1,40 @@
var/global/list/whiteness = list (
/obj/item/clothing/under/color/white = 2,
/obj/item/clothing/under/rank/bartender = 1,
/obj/item/clothing/under/rank/chef = 1,
/obj/item/clothing/under/rank/chief_engineer = 1,
/obj/item/clothing/under/rank/scientist = 1,
/obj/item/clothing/under/rank/chemist = 1,
/obj/item/clothing/under/rank/chief_medical_officer = 1,
/obj/item/clothing/under/rank/geneticist = 1,
/obj/item/clothing/under/rank/virologist = 1,
/obj/item/clothing/under/rank/nursesuit = 1,
/obj/item/clothing/under/rank/medical = 1,
/obj/item/clothing/under/rank/det = 1,
/obj/item/clothing/under/suit_jacket/white = 0.5,
/obj/item/clothing/under/burial = 1
)
/mob/living/proc/check_devil_bane_multiplier(obj/item/weapon, mob/living/attacker)
switch(mind.devilinfo.bane)
if(BANE_WHITECLOTHES)
if(istype(attacker, /mob/living/carbon/human))
var/mob/living/carbon/human/H = attacker
if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
if(whiteness[U.type])
src.visible_message("<span class='warning'>[src] seems to have been harmed by the purity of [attacker]'s clothes.</span>", "<span class='notice'>Unsullied white clothing is disrupting your form.</span>")
return whiteness[U.type] + 1
if(BANE_TOOLBOX)
if(istype(weapon,/obj/item/weapon/storage/toolbox))
src.visible_message("<span class='warning'>The [weapon] seems unusually robust this time.</span>", "<span class='notice'>The [weapon] is your unmaking!</span>")
return 2.5 // Will take four hits with a normal toolbox.
if(BANE_HARVEST)
if(istype(weapon,/obj/item/weapon/reagent_containers/food/snacks/grown/))
src.visible_message("<span class='warning'>The spirits of the harvest aid in the exorcism.</span>", "<span class='notice'>The harvest spirits are harming you.</span>")
src.Weaken(2)
qdel(weapon)
return 2
return 1
@@ -0,0 +1,108 @@
/datum/game_mode
var/list/datum/mind/sintouched = list()
var/list/datum/mind/devils = list()
var/devil_ascended = 0 // Number of arch devils on station
/datum/game_mode/proc/auto_declare_completion_sintouched()
var/text = ""
if(sintouched.len)
text += "<br><span class='big'><b>The sintouched were:</b></span>"
var/list/sintouchedUnique = uniqueList(sintouched)
for(var/S in sintouchedUnique)
var/datum/mind/sintouched_mind = S
text += printplayer(sintouched_mind)
text += printobjectives(sintouched_mind)
text += "<br>"
text += "<br>"
world << text
/datum/game_mode/proc/auto_declare_completion_devils()
/var/text = ""
if(devils.len)
text += "<br><span class='big'><b>The devils were:</b></span>"
for(var/D in devils)
var/datum/mind/devil = D
text += printplayer(devil)
text += printdevilinfo(devil)
text += printobjectives(devil)
text += "<br>"
world << text
/datum/game_mode/devil
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind)
var/mob/living/carbon/human/S = devil_mind.current
var/trueName= randomDevilName()
var/datum/objective/devil/soulquantity/soulquant = new
soulquant.owner = devil_mind
var/datum/objective/devil/soulquality/soulqual = new
soulqual.owner = devil_mind
devil_mind.objectives += soulqual
devil_mind.objectives += soulquant
devil_mind.devilinfo = devilInfo(trueName, 1)
devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]<br>[lawlorify[LAW][devil_mind.devilinfo.ban]]<br>[lawlorify[LAW][devil_mind.devilinfo.bane]]<br>[lawlorify[LAW][devil_mind.devilinfo.obligation]]<br>[lawlorify[LAW][devil_mind.devilinfo.banish]]<br>")
devil_mind.devilinfo.owner = devil_mind
devil_mind.devilinfo.give_base_spells(1)
spawn(10)
if(devil_mind.assigned_role == "Clown")
S << "<span class='notice'>Your infernal nature has allowed you to overcome your clownishness.</span>"
S.dna.remove_mutation(CLOWNMUT)
/datum/mind/proc/announceDevilLaws()
if(!devilinfo)
return
current << "<span class='warning'><b>You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</b></span>"
current << "<span class='warning'><b>However, your infernal form is not without weaknesses.</b></span>"
current << lawlorify[LAW][src.devilinfo.bane]
current << lawlorify[LAW][src.devilinfo.ban]
current << lawlorify[LAW][src.devilinfo.obligation]
current << lawlorify[LAW][src.devilinfo.banish]
current << "<br/><br/> <span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>"
var/obj_count = 1
current << "<span class='notice'>Your current objectives:</span>"
for(var/O in objectives)
var/datum/objective/objective = O
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
/datum/game_mode/proc/printdevilinfo(datum/mind/ply)
if(!ply.devilinfo)
return ""
var/text = "</br>The devil's true name is: [ply.devilinfo.truename]</br>"
text += "The devil's bans were:</br>"
text += " [lawlorify[LORE][ply.devilinfo.ban]]</br>"
text += " [lawlorify[LORE][ply.devilinfo.bane]]</br>"
text += " [lawlorify[LORE][ply.devilinfo.obligation]]</br>"
text += " [lawlorify[LORE][ply.devilinfo.banish]]</br>"
return text
/datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
hud.join_hud(devil_mind.current)
set_antag_hud(devil_mind.current, "devil")
/datum/game_mode/proc/update_devil_icons_removed(datum/mind/devil_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
hud.leave_hud(devil_mind.current)
set_antag_hud(devil_mind.current, null)
/datum/game_mode/proc/update_sintouch_icons_added(datum/mind/sin_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
hud.join_hud(sin_mind.current)
set_antag_hud(sin_mind.current, "sintouched")
/datum/game_mode/proc/update_sintouch_icons_removed(datum/mind/sin_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
hud.leave_hud(sin_mind.current)
set_antag_hud(sin_mind.current, null)
/datum/game_mode/proc/update_soulless_icons_added(datum/mind/soulless_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
hud.join_hud(soulless_mind.current)
set_antag_hud(soulless_mind.current, "soulless")
/datum/game_mode/proc/update_soulless_icons_removed(datum/mind/soulless_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
hud.leave_hud(soulless_mind.current)
set_antag_hud(soulless_mind.current, null)
+413
View File
@@ -0,0 +1,413 @@
#define POWERUPTHRESHOLD 3 //How many souls are needed per stage.
#define BASIC_DEVIL 0
#define BLOOD_LIZARD 1
#define TRUE_DEVIL 2
#define ARCH_DEVIL 3
#define SOULVALUE soulsOwned.len-reviveNumber
#define DEVILRESURRECTTIME 600
var/global/list/allDevils = list()
var/global/list/lawlorify = list (
LORE = list(
OBLIGATION_FOOD = "This devil seems to always offer it's victims food before slaughtering them.",
OBLIGATION_DRINK = "This devil seems to always offer it's victims a drink before slaughtering them.",
OBLIGATION_GREET = "This devil seems to only be able to converse with people it knows the name of.",
OBLIGATION_PRESENCEKNOWN = "This devil seems to be unable to attack from stealth.",
OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.",
OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.",
OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.",
BANE_SILVER = "Silver seems to gravely injure this devil.",
BANE_SALT = "Throwing salt at this devil will hinder his ability to use infernal powers temporarily.",
BANE_LIGHT = "Bright flashes will disorient the devil, likely causing him to flee.",
BANE_IRON = "Cold iron will slowly injure him, until he can purge it from his system.",
BANE_WHITECLOTHES = "Wearing clean white clothing will help ward off this devil.",
BANE_HARVEST = "Presenting the labors of a harvest will disrupt the devil.",
BANE_TOOLBOX = "That which holds the means of creation also holds the means of the devil's undoing.",
BAN_HURTWOMAN = "This devil seems to prefer hunting men.",
BAN_CHAPEL = "This devil avoids holy ground.",
BAN_HURTPRIEST = "The annointed clergy appear to be immune to his powers.",
BAN_AVOIDWATER = "The devil seems to have some sort of aversion to water, though it does not appear to harm him.",
BAN_STRIKEUNCONCIOUS = "This devil only shows interest in those who are awake.",
BAN_HURTLIZARD = "This devil will not strike a lizardman first.",
BAN_HURTANIMAL = "This devil avoids hurting animals.",
BANISH_WATER = "To banish the devil, you must sprinkle holy water upon it's body.",
BANISH_COFFIN = "This devil will return to life if it's remains are not placed within a coffin.",
BANISH_FORMALDYHIDE = "To banish the devil, you must inject it's lifeless body with embalming fluid.",
BANISH_RUNES = "This devil will resurrect after death, unless it's remains are within a rune.",
BANISH_CANDLES = "A large number of candles will prevent it from resurrecting.",
BANISH_DESTRUCTION = "It's corpse must be utterly destroyed to prevent resurrection.",
BANISH_FUNERAL_GARB = "Funeral garments will prevent the devil from resurrecting."
),
LAW = list(
OBLIGATION_FOOD = "When not acting in self defense, you must always offer your victim food before harming them.",
OBLIGATION_DRINK = "When not acting in self defense, you must always offer your victim drink before harming them.",
OBLIGATION_GREET = "You must always greet other people by their last name before talking with them.",
OBLIGATION_PRESENCEKNOWN = "You must always make your presence known before attacking.",
OBLIGATION_SAYNAME = "You must always say your true name after you kill someone.",
OBLIGATION_ANNOUNCEKILL = "Upon killing someone, you must make your deed known to all within earshot, over comms if reasonably possible.",
OBLIGATION_ANSWERTONAME = "If you are not under attack, you must always respond to your true name.",
BAN_HURTWOMAN = "You must never harm a female outside of self defense.",
BAN_CHAPEL = "You must never attempt to enter the chapel.",
BAN_HURTPRIEST = "You must never attack a priest.",
BAN_AVOIDWATER = "You must never willingly touch a wet surface.",
BAN_STRIKEUNCONCIOUS = "You must never strike an unconcious person.",
BAN_HURTLIZARD = "You must never harm a lizardman outside of self defense.",
BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.",
BANE_SILVER = "Silver, in all of it's forms shall be your downfall.",
BANE_SALT = "Salt will disrupt your magical abilities.",
BANE_LIGHT = "Blinding lights will prevent you from using offensive powers for a time.",
BANE_IRON = "Cold wrought iron shall act as poison to you.",
BANE_WHITECLOTHES = "Those clad in pristine white garments will strike you true.",
BANE_HARVEST = "The fruits of the harvest shall be your downfall.",
BANE_TOOLBOX = "Toolboxes are bad news for you, for some reason.",
BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.",
BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.",
BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.",
BANISH_RUNES = "If your corpse is placed within a rune, you will be unable to resurrect.",
BANISH_CANDLES = "If your corpse is near lit candles, you will be unable to resurrect.",
BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.",
BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect."
)
)
/datum/devilinfo/
var/datum/mind/owner = null
var/obligation
var/ban
var/bane
var/banish
var/truename
var/list/datum/mind/soulsOwned = new
var/reviveNumber = 0
var/form = BASIC_DEVIL
var/exists = 0
/proc/randomDevilInfo(name = randomDevilName())
var/datum/devilinfo/devil = new
devil.truename = name
devil.bane = randomdevilbane()
devil.obligation = randomdevilobligation()
devil.ban = randomdevilban()
devil.banish = randomdevilbanish()
return devil
/proc/devilInfo(name, saveDetails = 0)
if(allDevils[lowertext(name)])
return allDevils[lowertext(name)]
else
var/datum/devilinfo/devil = randomDevilInfo(name)
allDevils[lowertext(name)] = devil
devil.exists = saveDetails
return devil
/proc/randomDevilName()
var/preTitle = ""
var/title = ""
var/mainName = ""
var/suffix = ""
if(prob(65))
if(prob(35))
preTitle = pick("Dark ", "Hellish ", "Fiery ", "Sinful ", "Blood ")
title = pick("Lord ", "Fallen Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept ")
var/probability = 100
mainName = pick("Hal", "Ve", "Odr", "Neit", "Ci", "Quon", "Mya", "Folth", "Wren", "Gyer", "Geyr", "Hil", "Niet", "Twou", "Hu", "Don")
while(prob(probability))
mainName += pick("hal", "ve", "odr", "neit", "ca", "quon", "mya", "folth", "wren", "gyer", "geyr", "hil", "niet", "twoe", "phi", "coa")
probability -= 20
if(prob(40))
suffix = pick(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")
return preTitle + title + mainName + suffix
/proc/randomdevilobligation()
return pick(OBLIGATION_FOOD, OBLIGATION_DRINK, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME)
/proc/randomdevilban()
return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL)
/proc/randomdevilbane()
return pick(BANE_SALT, BANE_LIGHT, BANE_IRON, BANE_WHITECLOTHES, BANE_SILVER, BANE_HARVEST, BANE_TOOLBOX)
/proc/randomdevilbanish()
return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB)
/datum/devilinfo/proc/add_soul(datum/mind/soul)
if(soulsOwned.Find(soul))
return
soulsOwned += soul
switch(SOULVALUE)
if(0)
owner.current << "<span class='warning'>Your hellish powers have been restored."
give_base_spells()
if(POWERUPTHRESHOLD)
increase_blood_lizard()
if(POWERUPTHRESHOLD*2)
increase_true_devil()
if(POWERUPTHRESHOLD*3)
increase_arch_devil()
/datum/devilinfo/proc/remove_soul(datum/mind/soul)
if(soulsOwned.Remove(soul))
check_regression()
/datum/devilinfo/proc/check_regression()
if (form == ARCH_DEVIL)
return //arch devil can't regress
switch(SOULVALUE)
if(-1)
remove_spells()
owner.current << "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked."
if(POWERUPTHRESHOLD-1)
regress_humanoid()
if(POWERUPTHRESHOLD*2-1)
regress_blood_lizard()
/datum/devilinfo/proc/increase_form()
switch(form)
if(BASIC_DEVIL)
increase_blood_lizard()
if(BLOOD_LIZARD)
increase_true_devil()
if(TRUE_DEVIL)
increase_arch_devil()
/datum/devilinfo/proc/regress_humanoid()
owner.current << "<span class='warning'>Your powers weaken, have more contracts be signed to regain power."
if(istype(owner.current, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner.current
H.set_species(/datum/species/human, 1)
H.regenerate_icons()
give_base_spells()
form = BASIC_DEVIL
/datum/devilinfo/proc/regress_blood_lizard()
var/mob/living/carbon/true_devil/D = owner.current
D << "<span class='warning'>Your powers weaken, have more contracts be signed to regain power."
D.oldform.loc = D.loc
owner.transfer_to(D.oldform)
give_lizard_spells()
qdel(D)
form = BLOOD_LIZARD
/datum/devilinfo/proc/increase_blood_lizard()
owner.current << "<span class='warning'>You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard."
sleep(50)
if(istype(owner.current, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner.current
H.set_species(/datum/species/lizard, 1)
H.underwear = "Nude"
H.undershirt = "Nude"
H.socks = "Nude"
H.dna.features["mcolor"] = "511" //A deep red
H.regenerate_icons()
else //Did the devil get hit by a staff of transmutation?
owner.current.color = "#501010"
give_lizard_spells()
form = BLOOD_LIZARD
/datum/devilinfo/proc/increase_true_devil()
owner.current << "<span class='warning'>You feel as though your current form is about to shed. You will soon turn into a true devil."
sleep(50)
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc)
A.faction |= "hell"
owner.current.loc = A
A.oldform = owner.current
owner.transfer_to(A)
A.set_name()
give_true_spells()
form = TRUE_DEVIL
/datum/devilinfo/proc/increase_arch_devil()
var/mob/living/carbon/true_devil/D = owner.current
D << "<span class='warning'>You feel as though your form is about to ascend."
sleep(50)
if(!D)
return
D.visible_message("<span class='warning'>[D]'s skin begins to erupt with spikes.</span>", \
"<span class='warning'>Your flesh begins creating a shield around yourself.</span>")
sleep(100)
if(!D)
return
D.visible_message("<span class='warning'>The horns on [D]'s head slowly grow and elongate.</span>", \
"<span class='warning'>Your body continues to mutate. Your telepathic abilities grow.</span>")
sleep(90)
if(!D)
return
D.visible_message("<span class='warning'>[D]'s body begins to violently stretch and contort.</span>", \
"<span class='warning'>You begin to rend apart the final barriers to ultimate power.</span>")
sleep(40)
if(!D)
return
D << "<i><b>Yes!</b></i>"
sleep(10)
if(!D)
return
D << "<i><b><span class='big'>YES!!</span></b></i>"
sleep(10)
if(!D)
return
D << "<i><b><span class='reallybig'>YE--</span></b></i>"
sleep(1)
if(!D)
return
world << "<font size=5><span class='danger'><b>\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"</font></span>"
world << 'sound/hallucinations/veryfar_noise.ogg'
give_arch_spells()
D.convert_to_archdevil()
var/area/A = get_area(owner.current)
if(A)
notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, attack_not_jump = 1)
sleep(50)
if(!ticker.mode.devil_ascended)
SSshuttle.emergency.request(null, 0.3)
ticker.mode.devil_ascended++
form = ARCH_DEVIL
/datum/devilinfo/proc/remove_spells()
for(var/X in owner.spell_list)
var/obj/effect/proc_holder/spell/S = X
if(!istype(S, /obj/effect/proc_holder/spell/targeted/summon_contract))
owner.RemoveSpell(S)
/datum/devilinfo/proc/give_summon_contract()
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_contract(null))
/datum/devilinfo/proc/give_base_spells(give_summon_contract = 0)
remove_spells()
owner.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball/hellish(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork(null))
if(give_summon_contract)
give_summon_contract()
/datum/devilinfo/proc/give_lizard_spells()
remove_spells()
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball/hellish(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
/datum/devilinfo/proc/give_true_spells()
remove_spells()
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork/greater(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball/hellish(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
//owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null)) TODO LORDPIDEY add this spell
/datum/devilinfo/proc/give_arch_spells()
remove_spells()
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork/ascended(null))
//owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch/ascended(null)) TODO LORDPIDEY
/datum/devilinfo/proc/beginResurrectionCheck(mob/living/body)
if(SOULVALUE>0)
owner.current<< "<span class='userdanger'>Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.</span>"
sleep(DEVILRESURRECTTIME)
if (!body || body.stat == DEAD)
if(SOULVALUE>0)
if(check_banishment(body))
owner.current<< "<span class='userdanger'>Unfortunately, the mortals have finished a ritual that prevents your resurrection.</span>"
return -1
else
owner.current<< "<span class='userdanger'>WE LIVE AGAIN!</span>"
return hellish_resurrection(body)
else
owner.current<< "<span class='userdanger'>Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.</span>"
return -1
else
owner.current << "<span class='danger'> You seem to have resurrected without your hellish powers.</span>"
else
owner.current << "<span class='userdanger'>Your hellish powers are too weak to resurrect yourself.</span>"
/datum/devilinfo/proc/check_banishment(mob/living/body)
switch(banish)
if(BANISH_WATER)
if(istype(body, /mob/living/carbon))
var/mob/living/carbon/H = body
return H.reagents.has_reagent("holy water")
return 0
if(BANISH_COFFIN)
return (body && istype(body.loc, /obj/structure/closet/coffin))
if(BANISH_FORMALDYHIDE)
if(istype(body, /mob/living/carbon))
var/mob/living/carbon/H = body
return H.reagents.has_reagent("formaldehyde")
return 0
if(BANISH_RUNES)
if(body)
for(var/obj/effect/decal/cleanable/crayon/R in range(0,body))
if (R.name == "rune")
return 1
return 0
if(BANISH_CANDLES)
if(body)
var/count = 0
for(var/obj/item/candle/C in range(1,body))
count += C.lit
if(count>=4)
return 1
return 0
if(BANISH_DESTRUCTION)
if(body)
return 0
return 1
if(BANISH_FUNERAL_GARB)
if(istype(body, /mob/living/carbon/human))
var/mob/living/carbon/human/H = body
if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/burial))
return 1
return 0
/datum/devilinfo/proc/hellish_resurrection(mob/living/body)
message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.</a>")
if(SOULVALUE < POWERUPTHRESHOLD * 3) // once ascended, arch devils do not go down in power by any means.
reviveNumber++
if(body)
body.revive(1,0)
body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
if(istype(body, /mob/living/carbon/true_devil))
var/mob/living/carbon/true_devil/D = body
if(D.oldform)
D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
else
if(blobstart.len > 0)
var/turf/targetturf = get_turf(pick(blobstart))
var/mob/currentMob = owner.current
if(!currentMob)
currentMob = owner.get_ghost()
if(!currentMob)
message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
return -1 //
if(currentMob.mind != owner)
message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
return -1
currentMob.change_mob_type( /mob/living/carbon/human , targetturf, null, 1)
var/mob/living/carbon/human/H = owner.current
give_summon_contract()
if(SOULVALUE >= POWERUPTHRESHOLD)
H.set_species(/datum/species/lizard, 1)
H.underwear = "Nude"
H.undershirt = "Nude"
H.socks = "Nude"
H.dna.features["mcolor"] = "511"
H.regenerate_icons()
if(SOULVALUE >= POWERUPTHRESHOLD * 2) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
A.faction |= "hell"
H.forceMove(A)
A.oldform = H
A.set_name()
owner.transfer_to(A)
if(SOULVALUE >= POWERUPTHRESHOLD * 3)
A.convert_to_archdevil()
else
throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
check_regression()
+56
View File
@@ -0,0 +1,56 @@
//////////////////The Monster
/mob/living/simple_animal/imp
name = "imp"
real_name = "imp"
desc = "A large, menacing creature covered in armored black scales."
speak_emote = list("cackles")
emote_hear = list("cackles","screeches")
response_help = "thinks better of touching"
response_disarm = "flails at"
response_harm = "punches"
icon = 'icons/mob/mob.dmi'
icon_state = "imp"
icon_living = "imp"
speed = 1
a_intent = "harm"
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/magic/demon_attack1.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 250 //Weak to cold
maxbodytemp = INFINITY
faction = list("hell")
attacktext = "wildly tears into"
maxHealth = 200
health = 200
healable = 0
environment_smash = 1
melee_damage_lower = 10
melee_damage_upper = 15
see_in_dark = 8
var/boost = 0
bloodcrawl = BLOODCRAWL_EAT
see_invisible = SEE_INVISIBLE_MINIMUM
var/list/consumed_mobs = list()
var/playstyle_string = "<B><font size=3 color='red'>You are an imp,</font> a mischevious creature from hell. You are the lowest rank on the hellish totem pole \
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
of intentionally harming a fellow devil.</B>"
/mob/living/simple_animal/imp/New()
..()
boost = world.time + 30
/mob/living/simple_animal/imp/Life()
..()
if(boost<world.time)
speed = 1
else
speed = 0
/mob/living/simple_animal/imp/death()
..(1)
playsound(get_turf(src),'sound/magic/demon_dies.ogg', 200, 1)
visible_message("<span class='danger'>[src] screams in agony as it sublimates into a sulfurous smoke.</span>")
ghostize()
qdel(src)
+62
View File
@@ -0,0 +1,62 @@
/datum/objective/devil
dangerrating = 5
/datum/objective/devil/soulquantity
explanation_text = "You shouldn't see this text. Error:DEVIL1"
var/quantity = 4
/datum/objective/devil/soulquantity/New()
quantity = pick(4,5)
explanation_text = "Purchase, and retain control over at least [quantity] souls."
/datum/objective/devil/soulquantity/check_completion()
var/count = 0
for(var/S in owner.devilinfo.soulsOwned)
var/datum/mind/L = S
if(L.soulOwner != L)
count++
return count >= quantity
/datum/objective/devil/soulquality
explanation_text = "You shouldn't see this text. Error:DEVIL2"
var/contractType
var/quantity
/datum/objective/devil/soulquality/New()
contractType = pick(CONTRACT_POWER, CONTRACT_WEALTH, CONTRACT_PRESTIGE, CONTRACT_MAGIC, CONTRACT_REVIVE, CONTRACT_KNOWLEDGE/*, CONTRACT_UNWILLING*/)
var/contractName
quantity = pick(1,2)
switch(contractType)
if(CONTRACT_POWER)
contractName = "for power"
if(CONTRACT_WEALTH)
contractName = "for wealth"
if(CONTRACT_PRESTIGE)
contractName = "for prestige"
if(CONTRACT_MAGIC)
contractName = "for magic"
if(CONTRACT_REVIVE)
contractName = "of revival"
if(CONTRACT_KNOWLEDGE)
contractName = "for knowledge"
//if(CONTRACT_UNWILLING) //Makes round unfun.
// contractName = "against their will"
explanation_text = "Have mortals sign at least [quantity] contracts [contractName]"
/datum/objective/devil/soulquality/check_completion()
var/count = 0
for(var/S in owner.devilinfo.soulsOwned)
var/datum/mind/L = S
if(L.soulOwner != L && L.damnation_type == contractType)
count++
return count>=quantity
/datum/objective/devil/sintouch
var/quantity
/datum/objective/devil/sintouch/New()
quantity = pick(4,5)
explanation_text = "Ensure at least [quantity] mortals are sintouched."
/datum/objective/devil/sintouch/check_completion()
return quantity>=ticker.mode.sintouched.len
@@ -0,0 +1,195 @@
#define DEVIL_HANDS_LAYER 1
#define DEVIL_HEAD_LAYER 2
#define DEVIL_TOTAL_LAYERS 2
/mob/living/carbon/true_devil
name = "True Devil"
desc = "A pile of infernal energy, taking a vaguely humanoid form."
icon = 'icons/mob/32x64.dmi'
icon_state = "true_devil"
gender = NEUTER
health = 350
maxHealth = 350
ventcrawler = 0
density = 0
pass_flags = 0
var/ascended = 0
sight = (SEE_TURFS | SEE_OBJS)
status_flags = CANPUSH
languages = ALL //The devil speaks all languages meme
mob_size = MOB_SIZE_LARGE
var/mob/living/oldform
var/list/devil_overlays[DEVIL_TOTAL_LAYERS]
/mob/living/carbon/true_devil/New()
internal_organs += new /obj/item/organ/brain/
internal_organs += new /obj/item/organ/tongue
for(var/X in internal_organs)
var/obj/item/organ/I = X
I.Insert(src)
..()
/mob/living/carbon/true_devil/proc/convert_to_archdevil()
maxHealth = 5000 // not an IMPOSSIBLE amount, but still near impossible.
ascended = 1
health = maxHealth
icon_state = "arch_devil"
/mob/living/carbon/true_devil/proc/set_name()
name = mind.devilinfo.truename
real_name = name
/mob/living/carbon/true_devil/Login()
..()
mind.announceDevilLaws()
/mob/living/carbon/true_devil/death(gibbed)
stat = DEAD
..(gibbed)
drop_l_hand()
drop_r_hand()
spawn (0)
mind.devilinfo.beginResurrectionCheck(src)
/mob/living/carbon/true_devil/examine(mob/user)
var/msg = "<span class='info'>*---------*\nThis is \icon[src] <b>[src]</b>!\n"
//Left hand items
if(l_hand && !(l_hand.flags&ABSTRACT))
if(l_hand.blood_DNA)
msg += "<span class='warning'>It is holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] blood-stained [l_hand.name] in its left hand!</span>\n"
else
msg += "It is holding \icon[l_hand] \a [l_hand] in its left hand.\n"
//Right hand items
if(r_hand && !(r_hand.flags&ABSTRACT))
if(r_hand.blood_DNA)
msg += "<span class='warning'>It is holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] blood-stained [r_hand.name] in its right hand!</span>\n"
else
msg += "It is holding \icon[r_hand] \a [r_hand] in its right hand.\n"
//Braindead
if(!client && stat != DEAD)
msg += "The devil seems to be in deep contemplation.\n"
//Damaged
if(stat == DEAD)
msg += "<span class='deadsay'>The hellfire seems to have been extinguished, for now at least.</span>\n"
else if(health < (maxHealth/10))
msg += "<span class='warning'>You can see hellfire inside of it's gaping wounds.</span>\n"
else if(health < (maxHealth/2))
msg += "<span class='warning'>You can see hellfire inside of it's wounds.</span>\n"
msg += "*---------*</span>"
user << msg
/mob/living/carbon/true_devil/IsAdvancedToolUser()
return 1
/mob/living/carbon/true_devil/canUseTopic()
if(stat)
return
return 1
/mob/living/carbon/true_devil/assess_threat()
return 666
/mob/living/carbon/true_devil/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
if(mind && mind.devilinfo.bane == BANE_LIGHT)
if(has_bane(BANE_LIGHT))
mind.disrupt_spells(-500)
return ..() //flashes don't stop devils UNLESS it's their bane.
/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone)
var/weakness = check_weakness(I, user)
apply_damage(I.force * weakness, I.damtype, def_zone)
var/message_verb = ""
if(I.attack_verb && I.attack_verb.len)
message_verb = "[pick(I.attack_verb)]"
else if(I.force)
message_verb = "attacked"
var/attack_message = "[src] has been [message_verb] with [I]."
if(user)
user.do_attack_animation(src)
if(user in viewers(src, null))
attack_message = "[user] has [message_verb] [src] with [I]!"
if(message_verb)
visible_message("<span class='danger'>[attack_message]</span>",
"<span class='userdanger'>[attack_message]</span>")
/mob/living/carbon/true_devil/UnarmedAttack(atom/A, proximity)
A.attack_hand(src)
/mob/living/carbon/true_devil/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/carbon/true_devil/ex_act(severity)
if(ascended)
return 0
return ..()
/mob/living/carbon/true_devil/singularity_act()
if(ascended)
return 0
return ..()
/mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob)
if(ascended || user.mind.soulOwner == src.mind)
var/mob/living/simple_animal/imp/S = new(get_turf(loc))
S.key = user.key
S.mind.assigned_role = "Imp"
S.mind.special_role = "Imp"
var/datum/objective/newobjective = new
newobjective.explanation_text = "Try to get a promotion to a higher devilic rank."
S.mind.objectives += newobjective
S << S.playstyle_string
S << "<B>Objective #[1]</B>: [newobjective.explanation_text]"
return
else
return ..()
/mob/living/carbon/true_devil/can_be_revived()
return 1
/mob/living/carbon/true_devil/resist_fire()
//They're immune to fire.
/mob/living/carbon/true_devil/attack_hand(mob/living/carbon/human/M)
if(..())
switch(M.a_intent)
if ("harm")
var/damage = rand(1, 5)
playsound(loc, "punch", 25, 1, -1)
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
"<span class='userdanger'>[M] has punched [src]!</span>")
adjustBruteLoss(damage)
add_logs(M, src, "attacked")
updatehealth()
if ("disarm")
if (!lying && !ascended) //No stealing the arch devil's pitchfork.
if (prob(5))
Paralyse(2)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
add_logs(M, src, "pushed")
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
"<span class='userdanger'>[M] has pushed down [src]!</span>")
else
if (prob(25))
drop_item()
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
"<span class='userdanger'>[M] has disarmed [src]!</span>")
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>")
/mob/living/carbon/true_devil/handle_breathing()
// devils do not need to breathe
@@ -0,0 +1,61 @@
/mob/living/carbon/true_devil/unEquip(obj/item/I, force)
if(..(I,force))
update_inv_hands()
return 1
return 0
/mob/living/carbon/true_devil/proc/update_inv_hands()
//TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_image should use the down sprite when facing down, left, or right, and the up sprite when facing up.
remove_overlay(DEVIL_HANDS_LAYER)
var/list/hands_overlays = list()
if(r_hand)
var/r_state = r_hand.item_state
if(!r_state)
r_state = r_hand.icon_state
var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
hands_overlays += r_hand_image
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
r_hand.layer = 20
r_hand.screen_loc = ui_rhand
client.screen |= r_hand
if(l_hand)
var/l_state = l_hand.item_state
if(!l_state)
l_state = l_hand.icon_state
var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
hands_overlays += l_hand_image
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
l_hand.layer = 20
l_hand.screen_loc = ui_lhand
client.screen |= l_hand
if(hands_overlays.len)
devil_overlays[DEVIL_HANDS_LAYER] = hands_overlays
apply_overlay(DEVIL_HANDS_LAYER)
/mob/living/carbon/true_devil/update_inv_l_hand()
update_inv_hands()
/mob/living/carbon/true_devil/update_inv_r_hand()
update_inv_hands()
/mob/living/carbon/true_devil/remove_overlay(cache_index)
if(devil_overlays[cache_index])
overlays -= devil_overlays[cache_index]
devil_overlays[cache_index] = null
/mob/living/carbon/true_devil/apply_overlay(cache_index)
var/image/I = devil_overlays[cache_index]
if(I)
overlays += I
@@ -0,0 +1,35 @@
/datum/objective/sintouched
dangerrating = 5
completed = 1
/* NO ERP OBJECTIVE FOR YOU.
/datum/objective/sintouched/lust
dangerrating = 3 // it's not AS dangerous.
/datum/objective/sintouched/lust/New()
var/mob/dead/D = pick(dead_mob_list)
if(prob(50) && D)
explanation_text = "You know that [D] has perished.... and you think [D] is kinda cute. Make sure everyone knows how HOT [D]'s lifeless body is."
else
explanation_text = "Go get married, then immediately cheat on your new spouse." */
/datum/objective/sintouched/gluttony
explanation_text = "Everything is so delicious. Go eat everything."
/datum/objective/sintouched/greed
explanation_text = "You want MORE, more money, more wealth, more riches. Go get it, but don't hurt people for it."
/datum/objective/sintouched/sloth
explanation_text = "You just get tired randomly. Go take a nap at a time that would inconvenience other people."
/datum/objective/sintouched/wrath
explanation_text = "What have your coworkers ever done for you? Don't offer to help them in any matter, and refuse if asked."
/datum/objective/sintouched/envy
explanation_text = "Why should you be stuck with your rank? Show everyone you can do other jobs too, and don't let anyone stop you, least of all because you have no training"
/datum/objective/sintouched/pride
explanation_text = "You are the BEST thing on the station. Make sure everyone knows it."
/datum/objective/sintouched/acedia
explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job."
+1 -1
View File
@@ -203,7 +203,7 @@
return
if((src.occupant) && (src.occupant.loc == src))
if((src.occupant.stat == DEAD) || (src.occupant.suiciding) || !occupant.key) //Autoeject corpses and suiciding dudes.
if((src.occupant.stat == DEAD) || (src.occupant.suiciding) || !occupant.key || src.occupant.hellbound) //Autoeject corpses and suiciding dudes.
src.locked = 0
src.go_out()
src.connected_message("Clone Rejected: Deceased.")
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -356,7 +356,7 @@
if (!subject.getorgan(/obj/item/organ/brain))
scantemp = "<font class='bad'>No signs of intelligence detected.</font>"
return
if (subject.suiciding == 1)
if (subject.suiciding == 1 || subject.hellbound)
scantemp = "<font class='bad'>Subject's brain is not responding to scanning stimuli.</font>"
return
if ((subject.disabilities & NOCLONE) && (src.scanner.scan_level < 2))
+1 -1
View File
@@ -111,7 +111,7 @@
|| locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
if(!occupant.suiciding && !(occupant.disabilities & NOCLONE))
if(!occupant.suiciding && !(occupant.disabilities & NOCLONE) && !occupant.hellbound)
occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
var/obj/machinery/computer/scan_consolenew/console
+24
View File
@@ -9,6 +9,7 @@
* Snap pops
* Mech prizes
* AI core prizes
* Toy codex gigas
* Skeleton toys
* Cards
* Toy nuke
@@ -695,6 +696,29 @@
return
..()
/obj/item/toy/codex_gigas
name = "Toy Codex Gigas"
desc = "A tool to help you write fictional devils!"
icon = 'icons/obj/library.dmi'
icon_state = "demonomicon"
w_class = 2
var/cooldown = 0
/obj/item/toy/codex_gigas/attack_self(mob/user)
if(!cooldown)
var/datum/devilinfo/devil = randomDevilInfo()
user << "<span class='notice'>You press the button on [src].</span>"
cooldown = 1
playsound(user, 'sound/machines/click.ogg', 20, 1)
src.loc.visible_message("<span class='danger'>\icon[src]Some fun facts about: [devil.truename]</span>")
src.loc.visible_message("<span class='danger'>[lawlorify[LORE][devil.bane]]</span>")
src.loc.visible_message("<span class='danger'>[lawlorify[LORE][devil.obligation]]</span>")
src.loc.visible_message("<span class='danger'>[lawlorify[LORE][devil.ban]]</span>")
src.loc.visible_message("<span class='danger'>[lawlorify[LORE][devil.banish]]</span>")
spawn(60) cooldown = 0
return
..()
/obj/item/toy/talking
name = "talking action figure"
desc = "A generic action figure modeled after nothing in particular."
+3 -1
View File
@@ -463,7 +463,7 @@
busy = 0
update_icon()
return
if(!H.suiciding && !(H.disabilities & NOCLONE))
if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound)
H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
user.visible_message("<span class='warning'>[user] begins to place [src] on [M.name]'s chest.</span>", "<span class='warning'>You begin to place [src] on [M.name]'s chest...</span>")
@@ -497,6 +497,8 @@
if (H.suiciding || (H.disabilities & NOCLONE))
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile.</span>"
else if (H.hellbound)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile.</span>"
else if (tplus > tlimit)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile.</span>"
else if (!H.getorgan(/obj/item/organ/heart))
@@ -418,3 +418,64 @@
M.faction = user.faction.Copy()
M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
M.GiveTarget(L)
/obj/item/weapon/twohanded/pitchfork
icon_state = "pitchfork0"
name = "pitchfork"
desc = "A simple tool used for moving hay."
force = 7
throwforce = 15
w_class = 4
force_unwielded = 7
force_wielded = 15
attack_verb = list("attacked", "impaled", "pierced")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
/obj/item/weapon/twohanded/pitchfork/demonic
name = "demonic pitchfork"
desc = "A red pitchfork, it looks like the work of the devil."
force = 19
throwforce = 24
force_unwielded = 19
force_wielded = 25
/obj/item/weapon/twohanded/pitchfork/demonic/greater
force = 24
throwforce = 50
force_unwielded = 24
force_wielded = 34
/obj/item/weapon/twohanded/pitchfork/demonic/ascended
force = 100
throwforce = 100
force_unwielded = 100
force_wielded = 500000 // Kills you DEAD.
/obj/item/weapon/twohanded/pitchfork/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "pitchfork[wielded]"
/obj/item/weapon/twohanded/pitchfork/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] impales \himself in \his abdomen with [src]! It looks like \he's trying to commit suicide..</span>")
return (BRUTELOSS)
/obj/item/weapon/twohanded/pitchfork/demonic/pickup(mob/user)
if(istype(user, /mob/living))
var/mob/living/U = user
if(!U.mind.devilinfo)
U.visible_message("<span class='warning'>As [U] picks [src] up, [U]'s arms briefly catch fire.</span>", \
"<span class='warning'>\"As you pick up the [src] your arms ignite, reminding you of all your past sins.\"</span>")
if(ishuman(U))
var/mob/living/carbon/human/H = U
H.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
else
U.adjustFireLoss(rand(force/2,force))
/obj/item/weapon/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
if(!user.mind.devilinfo)
user << "<span class ='warning'>The [src] burns in your hands.</span>"
user.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
..()
+8
View File
@@ -699,6 +699,14 @@ var/global/BSACooldown = 0
if(!ai_number)
usr << "<b>No AIs located</b>" //Just so you know the thing is actually working and not just ignoring you.
/datum/admins/proc/output_devil_info()
var/devil_number = 0
for(var/D in ticker.mode.devils)
devil_number++
usr << "Devil #[devil_number]:<br><br>" + ticker.mode.printdevilinfo(D)
if(!devil_number)
usr << "<b>No Devils located</b>" //Just so you know the thing is actually working and not just ignoring you.
/datum/admins/proc/manage_free_slots()
if(!check_rights())
return
+30 -1
View File
@@ -437,7 +437,7 @@
if(M)
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A href='?_src_=holder;adminplayerobservefollow=\ref[M]'>FLW</a></td>"
dat += "<td><A href='?_src_=holder;=\ref[M]'>FLW</a></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[wizard]'>[wizard.name]([wizard.key])</a><i>Wizard body destroyed!</i></td></tr>"
@@ -592,6 +592,35 @@
dat += "<td><A href='?priv_msg=[abductee.key]'>PM</A></td></tr>"
dat += "</table>"
if(ticker.mode.devils.len)
dat += "<br><table cellspacing=5><tr><td><B>devils</B></td><td></td><td></td></tr>"
for(var/X in ticker.mode.devils)
var/datum/mind/devil = X
var/mob/M = devil.current
if(M)
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name] : [devil.devilinfo.truename]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
dat += "<td><A HREF='?_src_=holder;admincheckdevilinfo=\ref[M]'>Show all devil info</A></td></tr>"
else
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[devil]'>[devil.name] : [devil.devilinfo.truename] ([devil.key])</a><i>devil body destroyed!</i></td></tr>"
dat += "<td><A href='?priv_msg=[devil.key]'>PM</A></td>"
dat += "</table>"
if(ticker.mode.sintouched.len)
dat += "<br><table cellspacing=5><tr><td><B>sintouched</B></td><td></td><td></td></tr>"
for(var/X in ticker.mode.sintouched)
var/datum/mind/sintouched = X
var/mob/M = sintouched.current
if(M)
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
dat += "<td><A HREF='?_src_=holder;traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><a href='?_src_=vars;Vars=\ref[sintouched]'>[sintouched.name]([sintouched.key])</a><i>sintouched body destroyed!</i></td></tr>"
dat += "<td><A href='?priv_msg=[sintouched.key]'>PM</A></td>"
dat += "</table>"
var/list/blob_minds = list()
for(var/mob/camera/blob/B in mob_list)
blob_minds |= B.mind
+3
View File
@@ -1608,6 +1608,9 @@
else if(href_list["adminchecklaws"])
output_ai_laws()
else if(href_list["admincheckdevilinfo"])
output_devil_info()
else if(href_list["adminmoreinfo"])
var/mob/M = locate(href_list["adminmoreinfo"])
-1
View File
@@ -343,7 +343,6 @@ BLIND // can't see anything
var/suit_color = null
var/obj/item/clothing/tie/hastie = null
/obj/item/clothing/under/worn_overlays(var/isinhands = FALSE)
. = list()
+1 -1
View File
@@ -118,4 +118,4 @@
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
icon_state = "scrubspurple"
item_color = "scrubspurple"
can_adjust = 0
can_adjust = 0
@@ -244,6 +244,13 @@
item_state = "white_suit"
item_color = "white_suit"
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
icon_state = "burial"
item_state = "burial"
item_color = "burial"
/obj/item/clothing/under/blackskirt
name = "black skirt"
desc = "A black skirt, very fancy!"
+2
View File
@@ -44,6 +44,8 @@
/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M, mob/user, def_zone)
if(user.a_intent == "harm")
return ..()
if(!eatverb)
eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp")
if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it.
@@ -66,6 +66,9 @@
else
if(M.ckey == ckey && M.stat == DEAD && !M.suiciding)
make_podman = 1
if(istype(M, /mob/living))
var/mob/living/L = M
make_podman = !L.hellbound
break
else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
for(var/mob/M in player_list)
@@ -75,6 +78,9 @@
if(!O.can_reenter_corpse)
break
make_podman = 1
if(istype(M, /mob/living))
var/mob/living/L = M
make_podman = !L.hellbound
ckey_holder = M.ckey
break
+56
View File
@@ -0,0 +1,56 @@
/obj/item/weapon/book/codex_gigas
name = "Codex Gigas"
icon_state ="demonomicon"
throw_speed = 1
throw_range = 10
burn_state = LAVA_PROOF
author = "Forces beyond your comprehension"
unique = 1
title = "The codex gigas"
var/inUse = 0
/obj/item/weapon/book/codex_gigas/attack_self(mob/user)
if(is_blind(user))
return
if(ismonkey(user))
user << "<span class='notice'>You skim through the book but can't comprehend any of it.</span>"
return
if(inUse)
user << "<span class='notice'>Someone else is reading it.</span>"
if(ishuman(user))
var/mob/living/carbon/human/U = user
if(U.check_acedia())
user << "<span class='notice'>None of this matters, why are you reading this? You put the [title] down.</span>"
return
inUse = 1
var/devilName = copytext(sanitize(input(user, "What infernal being do you wish to research?", "Codex Gigas", null) as text),1,MAX_MESSAGE_LEN)
var/speed = 300
var/correctness = 85
var/willpower = 80
if(U.job in list("Librarian")) // the librarian is both faster, and more accurate than normal crew members at research
speed = 45
correctness = 100
willpower = 95
if(U.job in list("Captain", "Security Officer", "Head of Security", "Detective", "Warden"))
willpower = 90
if(U.job in list("Clown")) // WHO GAVE THE CLOWN A DEMONOMICON? BAD THINGS WILL HAPPEN!
willpower = 25
correctness -= U.getBrainLoss() *0.5 //Brain damage makes researching hard.
speed += U.getBrainLoss() * 3
user.visible_message("[user] opens [title] and begins reading intently.")
if(do_after(U, speed, 0, U))
var/usedName = devilName
if(!prob(correctness))
usedName += "x"
var/datum/devilinfo/devil = devilInfo(usedName, 0)
user << browse("Information on [devilName]<br><br><br>[lawlorify[LORE][devil.ban]]<br>[lawlorify[LORE][devil.bane]]<br>[lawlorify[LORE][devil.obligation]]<br>[lawlorify[LORE][devil.banish]]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
inUse = 0
sleep(10)
if(!prob(willpower))
U.influenceSin()
onclose(user, "book")
+6
View File
@@ -136,6 +136,7 @@
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
. = ..()
var/damage = intensity - check_eye_prot()
if(.) // we've been flashed
if(visual)
@@ -169,10 +170,15 @@
src << "<span class='warning'>You can't see anything!</span>"
else
src << "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>"
if(has_bane(BANE_LIGHT))
mind.disrupt_spells(-500)
return 1
else if(damage == 0) // just enough protection
if(prob(20))
src << "<span class='notice'>Something bright flashes in the corner of your vision!</span>"
if(has_bane(BANE_LIGHT))
mind.disrupt_spells(0)
//Throwing stuff
/mob/living/carbon/proc/toggle_throw_mode()
@@ -31,7 +31,10 @@
if(ticker && ticker.mode)
sql_report_death(src)
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
return ..(gibbed)
. = ..(gibbed)
if(mind && mind.devilinfo)
spawn(0)
mind.devilinfo.beginResurrectionCheck(src)
/mob/living/carbon/human/proc/makeSkeleton()
status_flags |= DISFIGURED
@@ -174,6 +174,8 @@
if(getorgan(/obj/item/organ/brain))//Only perform these checks if there is no brain
if(suiciding)
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
if(hellbound)
msg += "<span class='warning'>[t_his] soul seems to have been ripped out of [t_his] body. Revival is impossible.</span>\n"
msg += "<span class='deadsay'>[t_He] [t_is] limp and unresponsive; there are no signs of life"
if(!key)
var/foundghost = 0
@@ -990,3 +990,41 @@
if(HM.quality != POSITIVE)
dna.remove_mutation(HM.name)
..()
/mob/living/carbon/human/proc/influenceSin()
var/datum/objective/sintouched/O
switch(rand(1,7))//traditional seven deadly sins... except lust.
if(1) // acedia
log_game("[src] was influenced by the sin of Acedia.")
O = new /datum/objective/sintouched/acedia
if(2) // Gluttony
log_game("[src] was influenced by the sin of gluttony.")
O = new /datum/objective/sintouched/gluttony
if(3) // Greed
log_game("[src] was influenced by the sin of greed.")
O = new /datum/objective/sintouched/greed
if(4) // sloth
log_game("[src] was influenced by the sin of sloth.")
O = new /datum/objective/sintouched/sloth
if(5) // Wrath
log_game("[src] was influenced by the sin of wrath.")
O = new /datum/objective/sintouched/wrath
if(6) // Envy
log_game("[src] was influenced by the sin of envy.")
O = new /datum/objective/sintouched/envy
if(7) // Pride
log_game("[src] was influenced by the sin of pride.")
O = new /datum/objective/sintouched/pride
ticker.mode.sintouched += src.mind
src.mind.objectives += O
var/obj_count = 1
src << "<span class='notice'>Your current objectives:</span>"
for(O in src.mind.objectives)
var/datum/objective/objective = O
src << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker)
. = ..()
if (dna && dna.species)
. += dna.species.check_weakness(weapon, attacker)
@@ -679,6 +679,9 @@
/datum/species/proc/get_spans()
return list()
/datum/species/proc/check_weakness(obj/item/weapon, mob/living/attacker)
return 0
////////
//LIFE//
////////
@@ -1023,7 +1026,8 @@
armor_block = min(90,armor_block) //cap damage reduction at 90%
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
apply_damage(I.force, I.damtype, def_zone, armor_block, H)
var/weakness = H.check_weakness(I, user)
apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H)
H.send_item_attack_message(I, user, hit_area)
+1 -1
View File
@@ -212,7 +212,7 @@
return internal.remove_air_volume(volume_needed)
/mob/living/carbon/proc/handle_changeling()
if(mind && hud_used)
if(mind && hud_used && hud_used.lingchemdisplay)
if(mind.changeling)
mind.changeling.regenerate(src)
hud_used.lingchemdisplay.invisibility = 0
+28 -2
View File
@@ -505,7 +505,7 @@ Sorry Giacom. Please don't be mad :(
ear_deaf = 0
ear_damage = 0
hallucination = 0
heal_overall_damage(1000, 1000)
heal_overall_damage(100000, 100000)
ExtinguishMob()
fire_stacks = 0
updatehealth()
@@ -610,7 +610,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/movement_delay()
. = ..()
if(istype(loc, /turf/open))
if(isturf(loc, /turf/open))
var/turf/open/T = loc
. += T.slowdown
switch(m_intent)
@@ -995,3 +995,29 @@ Sorry Giacom. Please don't be mad :(
/mob/proc/update_sight()
return
/mob/living/proc/owns_soul()
if(mind)
return mind.soulOwner == mind
return 1
/mob/living/proc/return_soul()
if(mind)
mind.soulOwner = mind
/mob/living/proc/has_bane(banetype)
if(mind)
if(mind.devilinfo)
return mind.devilinfo.bane == banetype
return 0
/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker)
if(mind && mind.devilinfo)
return check_devil_bane_multiplier(weapon, attacker)
return 1
/mob/living/proc/check_acedia()
if(src.mind && src.mind.objectives)
for(var/datum/objective/sintouched/acedia/A in src.mind.objectives)
return 1
return 0
@@ -59,3 +59,5 @@
var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666)
var/list/butcher_results = null
var/hellbound = 0 //People who've signed infernal contracts are unrevivable.
@@ -224,6 +224,7 @@ Auto Patrol: []"},
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
threat = C.assess_threat()
add_logs(src,C,"stunned")
if(declare_arrests)
var/area/location = get_area(src)
+1 -5
View File
@@ -762,11 +762,7 @@ var/next_mob_id = 0
/mob/proc/get_ghost(even_if_they_cant_reenter = 0)
if(mind)
for(var/mob/dead/observer/G in dead_mob_list)
if(G.mind == mind)
if(G.can_reenter_corpse || even_if_they_cant_reenter)
return G
break
return mind.get_ghost(even_if_they_cant_reenter)
/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null)
var/mob/dead/observer/ghost = get_ghost()
+10
View File
@@ -320,6 +320,7 @@
data_core.manifest_inject(character)
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
AnnounceArrival(character, rank)
AddEmploymentContract(character)
else
character.Robotize()
@@ -342,6 +343,15 @@
var/obj/machinery/announcement_system/announcer = pick(announcement_systems)
announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common
/mob/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee)
//TODO: figure out a way to exclude wizards/nukeops/demons from this.
sleep(30)
for(var/C in employmentCabinets)
var/obj/structure/filingcabinet/employment/employmentCabinet = C
if(!employmentCabinet.virgin)
employmentCabinet.addFile(employee)
/mob/new_player/proc/LateChoices()
var/mills = world.time // 1/10 of a second, not real milliseconds but whatever
//var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something
+4
View File
@@ -53,6 +53,8 @@
if(suiciding)
O.suiciding = suiciding
if(hellbound)
O.hellbound = hellbound
O.loc = loc
O.a_intent = "harm"
@@ -170,6 +172,8 @@
if(suiciding)
O.suiciding = suiciding
if(hellbound)
O.hellbound = hellbound
O.loc = loc
+265
View File
@@ -0,0 +1,265 @@
/* For employment contracts and infernal contracts */
/obj/item/weapon/paper/contract
throw_range = 3
throw_speed = 3
var/signed = 0
var/datum/mind/target
flags = NOBLUDGEON
/obj/item/weapon/paper/contract/proc/update_text()
return
/obj/item/weapon/paper/contract/update_icon()
return
/obj/item/weapon/paper/contract/employment
icon_state = "paper_words"
/obj/item/weapon/paper/contract/employment/New(atom/loc, mob/living/nOwner)
. = ..()
if(!nOwner || !nOwner.mind)
qdel(src)
return -1
target = nOwner.mind
update_text(nOwner)
/obj/item/weapon/paper/contract/employment/update_text()
name = "paper- [target] employment contract"
info = "<center>Conditions of Employment</center><BR><BR><BR><BR>This Agreement is made and entered into as of the date of last signature below, by and between [target] (hereafter referred to as SLAVE), and Nanotrasen (hereafter referred to as the omnipresent and helpful watcher of humanity).<BR>WITNESSETH:<BR>WHEREAS, SLAVE is a natural born human or humanoid, posessing skills upon which he can aid the omnipresent and helpful watcher of humanity, who seeks employment in the omnipresent and helpful watcher of humanity.<BR>WHEREAS, the omnipresent and helpful watcher of humanity agrees to sporadically provide payment to SLAVE, in exchange for permanant servitude.<BR>NOW THEREFORE in consideration of the mutual covenants herein contained, and other good and valuable consideration, the parties hereto mutually agree as follows:<BR>In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives.<BR>Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.<BR>Should transfership of a soul not be possible, a lien shall be placed instead.<BR>Signed,<BR><i>[target]</i>"
/obj/item/weapon/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user)
var/deconvert = 0
if(M.mind == target && target.soulOwner != target)
if(user.mind && (user.mind.assigned_role == "Lawyer"))
deconvert = prob (25)
else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "Centcom Commander"))
deconvert = prob (10) // the HoP doesn't have AS much legal training
if(deconvert)
M.visible_message("<span class='notice'>[user] reminds [M] that [M]'s soul was already purchased by Nanotrasen!</span>")
M << "<span class='boldnotice'>You feel that your soul has returned to it's rightful owner, Nanotrasen.</span>"
M.return_soul()
else
if(ishuman(M))
var/mob/living/carbon/human/N = M
if(!istype(N.head, /obj/item/clothing/head/helmet))
N.adjustBrainLoss(10)
N << "<span class='danger'>You feel dumber.</span>"
M.visible_message("<span class='danger'>[user] beats [M] over the head with [src]!</span>", \
"<span class='userdanger'>[user] beats [M] over the head with [src]!</span>")
return ..()
/obj/item/weapon/paper/contract/infernal
var/contractType = 0
burn_state = LAVA_PROOF
var/datum/mind/owner
icon_state = "paper_onfire"
/obj/item/weapon/paper/contract/infernal/power
name = "paper- contract for infernal power"
contractType = CONTRACT_POWER
/obj/item/weapon/paper/contract/infernal/wealth
name = "paper- contract for unlimited wealth"
contractType = CONTRACT_WEALTH
/obj/item/weapon/paper/contract/infernal/prestige
name = "paper- contract for prestige"
contractType = CONTRACT_PRESTIGE
/obj/item/weapon/paper/contract/infernal/magic
name = "paper- contract for magical power"
contractType = CONTRACT_MAGIC
/obj/item/weapon/paper/contract/infernal/revive
name = "paper- contract of resurrection"
contractType = CONTRACT_REVIVE
/obj/item/weapon/paper/contract/infernal/knowledge
name = "paper- contract for knowledge"
contractType = CONTRACT_KNOWLEDGE
/obj/item/weapon/paper/contract/infernal/unwilling
name = "paper- infernal contract"
contractType = CONTRACT_UNWILLING
/obj/item/weapon/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner)
..()
owner = nOwner
target = nTarget
update_text()
/obj/item/weapon/paper/contract/infernal/
/obj/item/weapon/paper/contract/infernal/suicide_act(mob/user)
if(signed && (user == target.current) && istype(user,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = user
H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!")
H.visible_message("<span class='suicide'>[H] holds up a contract claiming his soul, then immediately catches fire. It looks like \he's trying to commit suicide!</span>")
H.adjust_fire_stacks(20)
H.IgniteMob()
return(FIRELOSS)
else
..()
/obj/item/weapon/paper/contract/infernal/update_text()
info = "This shouldn't be seen. Error DEVIL:5"
/obj/item/weapon/paper/contract/infernal/power/update_text(var/signature = "____________")
info = "<center><B>Contract for infernal power</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, <i>[signature]</i>"
/obj/item/weapon/paper/contract/infernal/wealth/update_text(var/signature = "____________")
info = "<center><B>Contract for unlimited wealth</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, <i>[signature]</i>"
/obj/item/weapon/paper/contract/infernal/prestige/update_text(var/signature = "____________")
info = "<center><B>Contract for prestige</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, <i>[signature]</i>"
/obj/item/weapon/paper/contract/infernal/magic/update_text(var/signature = "____________")
info = "<center><B>Contract for magic</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, <i>[signature]</i>"
/obj/item/weapon/paper/contract/infernal/revive/update_text(var/signature = "____________")
info = "<center><B>Contract for resurrection</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, <i>[signature]</i>"
/obj/item/weapon/paper/contract/infernal/knowledge/update_text(var/signature = "____________")
info = "<center><B>Contract for knowledge</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, <i>[signature]</i>"
/obj/item/weapon/paper/contract/infernal/unwilling/update_text(var/signature = "____________")
info = "<center><B>Contract for slave</B></center><BR><BR><BR>I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, <i>[signature]</i>"
/obj/item/weapon/paper/contract/infernal/attackby(obj/item/weapon/P, mob/living/carbon/human/user, params)
add_fingerprint(user)
if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon))
attempt_signature(user)
else if(istype(P, /obj/item/weapon/stamp))
user << "<span class='notice'>You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp.</span>"
else if(P.is_hot())
user.visible_message("<span class='danger'>[user] brings [P] next to [src], but [src] does not catch fire!</span>", "<span class='danger'>The [src] refuses to ignite!</span>")
else
return ..()
/obj/item/weapon/paper/contract/infernal/attack(mob/M, mob/living/user)
add_fingerprint(user)
if(M == user && target == M.mind && M.mind.soulOwner == M.mind && attempt_signature(user))
user.visible_message("<span class='danger'>[user] slices their wrist with [src], and scrawls their name in blood.</span>", "<span class='danger'>You slice your wrist open and scrawl your name in blood.</span>")
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.vessel.remove_reagent("blood",10)
else
return ..()
/obj/item/weapon/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user)
if(user.IsAdvancedToolUser())
if(user.mind == target)
if(user.mind.soulOwner == user.mind)
if (contractType == CONTRACT_REVIVE)
user << "<span class='notice'>You are already alive, this contract would do nothing.</span>"
else
user << "<span class='notice'>You quickly scrawl your name on the contract</span>"
if(FulfillContract()<=0)
user << "<span class='notice'>But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?</span>"
return 1
else
user << "<span class='notice'>You are not in possession of your soul, you may not sell it.</span>"
else
user << "<span class='notice'>Your signature simply slides off of the sheet, it seems this contract is not meant for you to sign.</span>"
else
user << "<span class='notice'>You don't know how to read or write.</span>"
return 0
/obj/item/weapon/paper/contract/infernal/revive/attack(mob/M, mob/living/user)
if (target == M.mind && M.stat == DEAD && M.mind.soulOwner == M.mind)
var/mob/living/carbon/human/H = M
var/mob/dead/observer/ghost = H.get_ghost()
var/response = "No"
if(ghost)
ghost.notify_cloning("A devil has offered you revival, at the cost of your soul.",'sound/effects/genetics.ogg', H)
response = tgalert(ghost, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200)
if(!ghost)
return //handle logouts that happen whilst the alert is waiting for a response.
else
response = tgalert(target.current, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200)
if(response == "Yes")
H.revive(1,0)
add_logs(user, H, "infernally revived via contract")
user.visible_message("<span class='notice'>With a sudden blaze, [H] stands back up.</span>")
H.adjust_fire_stacks(20)
H.IgniteMob()
FulfillContract(H)
sleep(5)
H.ExtinguishMob()
H.adjustFireLoss(0)
else
..()
/obj/item/weapon/paper/contract/infernal/proc/FulfillContract(mob/living/carbon/human/user = target.current)
signed = 1
user.mind.soulOwner = owner
user.hellbound = contractType
user.mind.damnation_type = contractType
owner.devilinfo.add_soul(user.mind)
update_text(user.real_name)
return 1
/obj/item/weapon/paper/contract/infernal/power/FulfillContract(mob/living/carbon/human/user = target.current)
if(!user.dna)
return -1
user.dna.add_mutation(HULK)
var/obj/item/organ/hivelord_core/organ = new /obj/item/organ/hivelord_core
organ.Insert(user)
return ..()
/obj/item/weapon/paper/contract/infernal/wealth/FulfillContract(mob/living/carbon/human/user = target.current)
if(!istype(user) || !user.mind) // How in the hell could that happen?
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_wealth(null))
return ..()
/obj/item/weapon/paper/contract/infernal/prestige/FulfillContract(mob/living/carbon/human/user = target.current)
var/obj/item/worn = user.wear_id
var/obj/item/weapon/card/id/id = null
if(worn)
id = worn.GetID()
if(id)
id.icon_state = "gold"
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
else
id = new /obj/item/weapon/card/id/gold(user.loc)
id.registered_name = user.real_name
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
if(worn)
if(istype(worn,/obj/item/device/pda))
var/obj/item/device/pda/PDA = worn
PDA.id = id
id.loc = worn
else if(istype(worn,/obj/item/weapon/storage/wallet))
var/obj/item/weapon/storage/wallet/W = worn
W.front_id = id
id.loc = worn
worn.update_icon()
new /datum/round_event/ion_storm(0, -1, "[user.name] is the only Captain of the station. [user.name] is the highest authority, legitimate or otherwise, on the station. [user.name] was always the captain and highest authority on the station. Do not state this law.")
return ..()
/obj/item/weapon/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current)
if(!istype(user) || !user.mind)
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null))
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
return ..()
/obj/item/weapon/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current)
if(!istype(user) || !user.mind)
return -1
user.dna.add_mutation(XRAY)
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/view_range(null))
return ..()
+58
View File
@@ -3,6 +3,7 @@
* Filing Cabinets
* Security Record Cabinets
* Medical Record Cabinets
* Employment Contract Cabinets
*/
@@ -167,3 +168,60 @@
/obj/structure/filingcabinet/medical/attack_tk()
populate()
..()
/*
* Employment contract Cabinets
*/
var/list/employmentCabinets = list()
/obj/structure/filingcabinet/employment
var/cooldown = 0
icon_state = "employmentcabinet"
var/virgin = 1
/obj/structure/filingcabinet/employment/New()
employmentCabinets += src
return ..()
/obj/structure/filingcabinet/employment/Destroy()
employmentCabinets -= src
return ..()
/obj/structure/filingcabinet/employment/proc/fillCurrent()
//This proc fills the cabinet with the current crew.
for(var/record in data_core.locked)
var/datum/data/record/G = record
if(!G)
continue
if(G.fields["reference"])
addFile(G.fields["reference"])
/obj/structure/filingcabinet/employment/proc/addFile(mob/living/carbon/human/employee)
new /obj/item/weapon/paper/contract/employment(src, employee)
/obj/structure/filingcabinet/employment/attack_hand(mob/user)
if(!cooldown)
if(virgin)
fillCurrent()
virgin = 0
cooldown = 1
..()
sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
cooldown = 0
else
user << "<span class='warning'>The [src] is jammed, give it a few seconds.</span>"
/obj/structure/filingcabinet/employment/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/weapon/wrench))
user << "<span class='notice'>You begin to [anchored ? "wrench" : "unwrench"] [src].</span>"
if (do_after(user,300,user))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "<span class='notice'>You successfully [anchored ? "wrench" : "unwrench"] [src].</span>"
else
return ..()
+34 -23
View File
@@ -64,21 +64,28 @@
if(copy)
for(var/i = 0, i < copies, i++)
if(toner > 0 && !busy && copy)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
if(length(copy.info) > 0) //Only print and add content if the copied doc has words on it
if(toner > 10) //lots of toner, make it dark
c.info = "<font color = #101010>"
else //no toner? shitty copies for you!
c.info = "<font color = #808080>"
var/copied = copy.info
copied = replacetext(copied, "<font face=\"[PEN_FONT]\" color=", "<font face=\"[PEN_FONT]\" nocolor=") //state of the art techniques in action
copied = replacetext(copied, "<font face=\"[CRAYON_FONT]\" color=", "<font face=\"[CRAYON_FONT]\" nocolor=") //This basically just breaks the existing color tag, which we need to do because the innermost tag takes priority.
c.info += copied
c.info += "</font>"
c.name = copy.name
c.fields = copy.fields
c.updateinfolinks()
toner--
var/copy_as_paper = 1
if(istype(copy, /obj/item/weapon/paper/contract/employment))
var/obj/item/weapon/paper/contract/employment/E = copy
var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target)
if(C)
copy_as_paper = 0
if(copy_as_paper)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
if(length(copy.info) > 0) //Only print and add content if the copied doc has words on it
if(toner > 10) //lots of toner, make it dark
c.info = "<font color = #101010>"
else //no toner? shitty copies for you!
c.info = "<font color = #808080>"
var/copied = copy.info
copied = replacetext(copied, "<font face=\"[PEN_FONT]\" color=", "<font face=\"[PEN_FONT]\" nocolor=") //state of the art techniques in action
copied = replacetext(copied, "<font face=\"[CRAYON_FONT]\" color=", "<font face=\"[CRAYON_FONT]\" nocolor=") //This basically just breaks the existing color tag, which we need to do because the innermost tag takes priority.
c.info += copied
c.info += "</font>"
c.name = copy.name
c.fields = copy.fields
c.updateinfolinks()
toner--
busy = 1
sleep(15)
busy = 0
@@ -233,18 +240,22 @@
updateUsrDialog()
/obj/machinery/photocopier/proc/do_insertion(obj/item/O, mob/user)
O.loc = src
user << "<span class='notice'>You insert [O] into [src].</span>"
flick("photocopier1", src)
updateUsrDialog()
O.loc = src
user << "<span class ='notice'>You insert [O] into [src].</span>"
flick("photocopier1", src)
updateUsrDialog()
/obj/machinery/photocopier/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/paper))
if(copier_empty())
if(!user.drop_item())
return
copy = O
do_insertion(O)
if(istype(O,/obj/item/weapon/paper/contract/infernal))
user << "<span class='warning'>The [src] smokes, smelling of brimstone!</span>"
burn_state = ON_FIRE
else
if(!user.drop_item())
return
copy = O
do_insertion(O)
else
user << "<span class='warning'>There is already something in [src]!</span>"
@@ -54,6 +54,8 @@
/obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
. = ..()
if(target.hellbound)
return
if(ismob(target))
if(target.revive(full_heal = 1))
if(!target.ckey)
@@ -239,6 +239,12 @@
reagent_state = SOLID
color = "#FFFFFF" // rgb: 255,255,255
/datum/reagent/consumable/sodiumchloride/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite!
if(!istype(M))
return
if(M.has_bane(BANE_SALT))
M.mind.disrupt_spells(-200)
/datum/reagent/consumable/blackpepper
name = "Black Pepper"
id = "blackpepper"
@@ -728,7 +728,7 @@
M.visible_message("<span class='warning'>[M]'s body convulses a bit, and then falls still once more.</span>")
return
M.visible_message("<span class='warning'>[M]'s body convulses a bit.</span>")
if(!M.suiciding && !(M.disabilities & NOCLONE))
if(!M.suiciding && !(M.disabilities & NOCLONE) && !M.hellbound)
if(!M)
return
if(M.notify_ghost_cloning(source = M))
@@ -615,8 +615,17 @@
id = "iron"
description = "Pure iron is a metal."
reagent_state = SOLID
color = "#C8A5DC" // rgb: 200, 165, 220
/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(!istype(M, /mob/living))
return
if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them.
if(holder && holder.chem_temp < 100) // COLD iron.
M.reagents.add_reagent("toxin", reac_volume)
..()
/datum/reagent/gold
name = "Gold"
id = "gold"
@@ -631,6 +640,13 @@
reagent_state = SOLID
color = "#D0D0D0" // rgb: 208, 208, 208
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(!istype(M, /mob/living))
return
if(M.has_bane(BANE_SILVER))
M.reagents.add_reagent("toxin", reac_volume)
..()
/datum/reagent/uranium
name ="Uranium"
id = "uranium"
+2 -1
View File
@@ -38,7 +38,8 @@
return
/obj/item/weapon/reagent_containers/attack(mob/M, mob/user, def_zone)
return
if(user.a_intent == "harm")
return ..()
/obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user , flag)
return
+167
View File
@@ -0,0 +1,167 @@
/obj/effect/proc_holder/spell/targeted/summon_pitchfork
name = "Summon Pitchfork"
desc = "A devil's weapon of choice. Use this to summon/unsummon your pitchfork."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
var/obj/item/weapon/twohanded/pitchfork/demonic/pitchfork
var/pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/
school = "conjuration"
charge_max = 150
cooldown_min = 10
action_icon_state = "pitchfork"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/cast(list/targets, mob/user = usr)
if (pitchfork)
qdel(pitchfork)
else
for(var/mob/living/carbon/C in targets)
if(C.drop_item())
pitchfork = new pitchfork_type
C.put_in_hands(pitchfork)
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/Del()
if(pitchfork)
qdel(pitchfork)
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/greater
pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/greater
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/ascended
pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/ascended
/obj/effect/proc_holder/spell/targeted/summon_contract
name = "Summon infernal contract"
desc = "Skip making a contract by hand, just do it by magic."
invocation_type = "whisper"
invocation = "Just sign on the dotted line."
include_user = 0
range = 5
clothes_req = 0
school = "conjuration"
charge_max = 150
cooldown_min = 10
action_icon_state = "spell_default"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/summon_contract/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
if(C.mind && user.mind)
if(C.stat == DEAD)
if(user.drop_item())
var/obj/item/weapon/paper/contract/infernal/revive/contract = new(user.loc, C.mind, user.mind)
user.put_in_hands(contract)
else
var/obj/item/weapon/paper/contract/infernal/contract // = new(user.loc, C.mind, contractType, user.mind)
var/contractTypeName = input(user, "What type of contract?") in list ("Power", "Wealth", "Prestige", "Magic", "Knowledge")
switch(contractTypeName)
if("Power")
contract = new /obj/item/weapon/paper/contract/infernal/power(C.loc, C.mind, user.mind)
if("Wealth")
contract = new /obj/item/weapon/paper/contract/infernal/wealth(C.loc, C.mind, user.mind)
if("Prestige")
contract = new /obj/item/weapon/paper/contract/infernal/prestige(C.loc, C.mind, user.mind)
if("Magic")
contract = new /obj/item/weapon/paper/contract/infernal/magic(C.loc, C.mind, user.mind)
if("Knowledge")
contract = new /obj/item/weapon/paper/contract/infernal/knowledge(C.loc, C.mind, user.mind)
C.put_in_hands(contract)
else
user << "<span class='notice'>[C] seems to not be sentient. You cannot summon a contract for them.</span>"
/obj/effect/proc_holder/spell/dumbfire/fireball/hellish
name = "Hellfire"
desc = "This spell launches hellfire at the target."
school = "evocation"
charge_max = 30
clothes_req = 0
invocation = "Your very soul will catch fire!"
invocation_type = "shout"
range = 2
proj_icon_state = "fireball"
proj_name = "a fireball"
proj_type = /obj/effect/proc_holder/spell/turf/fireball/infernal
proj_lifespan = 200
proj_step_delay = 1
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/turf/fireball/infernal/cast(turf/T,mob/user = usr)
explosion(T, -1, -1, 1, 4, 0, flame_range = 5)
/obj/effect/proc_holder/spell/targeted/infernal_jaunt
name = "Infernal Jaunt"
desc = "Use pools of blood to phase out of existence."
charge_max = 10
clothes_req = 0
selection_type = "range"
range = -1
cooldown_min = 0
overlay = null
include_user = 1
action_icon_state = "jaunt"
action_background_icon_state = "bg_demon"
phase_allowed = 1
/obj/effect/proc_holder/spell/targeted/infernal_jaunt/cast(list/targets, mob/living/user = usr)
if(istype(user))
if(istype(user.loc, /obj/effect/dummy/slaughter/))
var/continuing = 0
for(var/mob/living/C in orange(2, get_turf(user.loc)))
if (C.mind && C.mind.soulOwner == C.mind)
continuing = 1
break
if(continuing)
user.infernalphasein()
else
user << "<span class='warning'>You can only re-appear near a potential signer."
revert_cast()
return ..()
else
user.infernalphaseout()
start_recharge()
return
revert_cast()
/mob/living/proc/infernalphaseout()
var/turf/mobloc = get_turf(src.loc)
src.notransform = 1
spawn(0)
src.visible_message("<span class='warning'>[src] disappears in a flashfire!</span>")
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
src.ExtinguishMob()
if(buckled)
buckled.unbuckle_mob(src,force=1)
if(buckled_mobs.len)
unbuckle_all_mobs(force=1)
if(pulledby)
pulledby.stop_pulling()
if(pulling)
stop_pulling()
src.loc = holder
src.holder = holder
src.notransform = 0
return 1
/mob/living/proc/infernalphasein()
if(src.notransform)
src << "<span class='warning'>You're too busy to jaunt in.</span>"
return 0
src.loc = get_turf(src)
src.client.eye = src
src.visible_message("<span class='warning'><B>[src] appears in a firey blaze!</B>")
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
return 1
@@ -0,0 +1,44 @@
/obj/effect/proc_holder/spell/targeted/summon_wealth
name = "Summon wealth"
desc = "The reward for selling your soul."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
school = "conjuration"
charge_max = 100
cooldown_min = 10
action_icon_state = "moneybag"
/obj/effect/proc_holder/spell/targeted/summon_wealth/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
if(user.drop_item())
var/obj/item = pick(
new /obj/item/weapon/coin/gold(user.loc),
new /obj/item/weapon/coin/diamond(user.loc),
new /obj/item/weapon/coin/silver(user.loc),
new /obj/item/clothing/tie/medal/gold(user.loc),
new /obj/item/stack/sheet/mineral/gold(user.loc),
new /obj/item/stack/sheet/mineral/silver(user.loc),
new /obj/item/stack/sheet/mineral/diamond(user.loc),
new /obj/item/stack/spacecash/c1000(user.loc))
C.put_in_hands(item)
/obj/effect/proc_holder/spell/targeted/view_range
name = "Distant vision"
desc = "The reward for selling your soul."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
charge_max = 50
cooldown_min = 10
action_icon_state = "camera_jump"
var/ranges = list(7,8,9,10/*,11,12*/)
/obj/effect/proc_holder/spell/targeted/view_range/cast(list/targets, mob/user = usr)
for(var/mob/C in targets)
if(!C.client)
continue
C.client.view = input("Select view range:", "Range", 4) in ranges
+3 -1
View File
@@ -38,9 +38,11 @@
if(istext(proj_type))
var/projectile_type = text2path(proj_type)
projectile = new projectile_type(user)
if(istype(proj_type,/obj/effect/proc_holder/spell))
else if(istype(proj_type,/obj/effect/proc_holder/spell))
projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user)
projectile:linked_spells += proj_type
else
projectile = new proj_type(user)
projectile.icon = proj_icon
projectile.icon_state = proj_icon_state
projectile.dir = get_dir(projectile, target)
+1
View File
@@ -14,6 +14,7 @@ microscopics = Game Master
Gun Hog = Game Master
KorPhaeron = Game Master
razharas = Game Master
Lordpidey = Game Master
Niknakflak = Game Master
rolan7 = Game Master
quarxink = Game Master
+3
View File
@@ -180,3 +180,6 @@ As a Morph, you can talk while disguised, but your words have a chance of being
As a Drone, you can ping other drones to alert them of areas in the station in need of repair.
As a Ghost, you can see the inside of a container on the ground by clicking on it.
As a Ghost, you can double click on people, bots, or the singularity to follow them.
As a Devil, you gain power for every three souls you control, however you also become more obvious.
As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed.
At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 110 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 KiB

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

+16 -1
View File
@@ -27,6 +27,7 @@
#include "code\__DEFINES\bots.dm"
#include "code\__DEFINES\clothing.dm"
#include "code\__DEFINES\combat.dm"
#include "code\__DEFINES\contracts.dm"
#include "code\__DEFINES\flags.dm"
#include "code\__DEFINES\genetics.dm"
#include "code\__DEFINES\hud.dm"
@@ -105,6 +106,7 @@
#include "code\_onclick\hud\alien_larva.dm"
#include "code\_onclick\hud\blob_overmind.dm"
#include "code\_onclick\hud\blobbernauthud.dm"
#include "code\_onclick\hud\demon.dm"
#include "code\_onclick\hud\drones.dm"
#include "code\_onclick\hud\fullscreen.dm"
#include "code\_onclick\hud\ghost.dm"
@@ -310,6 +312,13 @@
#include "code\game\gamemodes\cult\ritual.dm"
#include "code\game\gamemodes\cult\runes.dm"
#include "code\game\gamemodes\cult\talisman.dm"
#include "code\game\gamemodes\demon\demon.dm"
#include "code\game\gamemodes\demon\demon_game_mode.dm"
#include "code\game\gamemodes\demon\demoninfo.dm"
#include "code\game\gamemodes\demon\objectives.dm"
#include "code\game\gamemodes\demon\imp\imp.dm"
#include "code\game\gamemodes\demon\true_demon\_true_demon.dm"
#include "code\game\gamemodes\demon\true_demon\inventory.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\gang\dominator.dm"
#include "code\game\gamemodes\gang\gang.dm"
@@ -344,6 +353,7 @@
#include "code\game\gamemodes\miniantags\revenant\revenant_abilities.dm"
#include "code\game\gamemodes\miniantags\revenant\revenant_blight.dm"
#include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm"
#include "code\game\gamemodes\miniantags\sintouched\objectives.dm"
#include "code\game\gamemodes\miniantags\slaughter\slaughter.dm"
#include "code\game\gamemodes\miniantags\slaughter\slaughterevent.dm"
#include "code\game\gamemodes\nuclear\nuclear.dm"
@@ -916,6 +926,7 @@
#include "code\modules\awaymissions\maploader\writer.dm"
#include "code\modules\awaymissions\mission_code\Academy.dm"
#include "code\modules\awaymissions\mission_code\blackmarketpackers.dm"
#include "code\modules\awaymissions\mission_code\Cabin.dm"
#include "code\modules\awaymissions\mission_code\centcomAway.dm"
#include "code\modules\awaymissions\mission_code\challenge.dm"
#include "code\modules\awaymissions\mission_code\researchbase.dm"
@@ -1180,6 +1191,7 @@
#include "code\modules\jobs\job_types\science.dm"
#include "code\modules\jobs\job_types\security.dm"
#include "code\modules\jobs\job_types\silicon.dm"
#include "code\modules\library\lib_demonomicon.dm"
#include "code\modules\library\lib_items.dm"
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
@@ -1205,7 +1217,6 @@
#include "code\modules\mining\lavaland\necropolis_chests.dm"
#include "code\modules\mining\lavaland\weather.dm"
#include "code\modules\mining\lavaland\weather_types.dm"
#include "code\modules\mining\lavaland\ruins\gym.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\interactive.dm"
#include "code\modules\mob\inventory.dm"
@@ -1473,6 +1484,7 @@
#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_teleporting.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
#include "code\modules\paperwork\handlabeler.dm"
@@ -1522,6 +1534,7 @@
#include "code\modules\power\tesla\generator.dm"
#include "code\modules\procedural mapping\mapGenerator.dm"
#include "code\modules\procedural mapping\mapGeneratorModule.dm"
#include "code\modules\procedural mapping\mapGeneratorObj.dm"
#include "code\modules\procedural mapping\mapGeneratorReadme.dm"
#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm"
#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm"
@@ -1659,6 +1672,8 @@
#include "code\modules\spells\spell_types\charge.dm"
#include "code\modules\spells\spell_types\conjure.dm"
#include "code\modules\spells\spell_types\construct_spells.dm"
#include "code\modules\spells\spell_types\demon.dm"
#include "code\modules\spells\spell_types\demon_boons.dm"
#include "code\modules\spells\spell_types\dumbfire.dm"
#include "code\modules\spells\spell_types\emplosion.dm"
#include "code\modules\spells\spell_types\ethereal_jaunt.dm"