mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 00:29:02 +01:00
Merge branch 'master' of git://github.com/tgstation/-tg-station.git
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
#define CANWEAKEN 2
|
||||
#define CANPARALYSE 4
|
||||
#define CANPUSH 8
|
||||
#define GOTTAGOFAST 16
|
||||
#define GODMODE 4096
|
||||
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
|
||||
#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"] && modifiers["ctrl"])
|
||||
CtrlShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
return
|
||||
@@ -83,6 +86,9 @@
|
||||
than anything else in the game, atoms have separate procs
|
||||
for AI shift, ctrl, and alt clicking.
|
||||
*/
|
||||
|
||||
/mob/living/silicon/ai/CtrlShiftClickOn(var/atom/A)
|
||||
A.AICtrlShiftClick(src)
|
||||
/mob/living/silicon/ai/ShiftClickOn(var/atom/A)
|
||||
A.AIShiftClick(src)
|
||||
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
|
||||
@@ -94,6 +100,17 @@
|
||||
The following criminally helpful code is just the previous code cleaned up;
|
||||
I have no idea why it was in atoms.dm instead of respective files.
|
||||
*/
|
||||
/atom/proc/AICtrlShiftClick()
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/AICtrlShiftClick() // Sets/Unsets Emergency Access Override
|
||||
if(emagged)
|
||||
return
|
||||
if(!emergency)
|
||||
Topic("aiEnable=11", list("aiEnable"="11"), 1) // 1 meaning no window (consistency!)
|
||||
else
|
||||
Topic("aiDisable=11", list("aiDisable"="11"), 1)
|
||||
return
|
||||
|
||||
/atom/proc/AIShiftClick()
|
||||
return
|
||||
@@ -122,6 +139,10 @@
|
||||
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
|
||||
toggle_breaker()
|
||||
|
||||
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
|
||||
src.enabled = !src.enabled
|
||||
src.updateTurrets()
|
||||
|
||||
|
||||
/atom/proc/AIAltClick(var/mob/living/silicon/ai/user)
|
||||
AltClick(user)
|
||||
@@ -138,6 +159,10 @@
|
||||
Topic("aiDisable=5", list("aiDisable"="5"), 1)
|
||||
return
|
||||
|
||||
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
|
||||
src.lethal = !src.lethal
|
||||
src.updateTurrets()
|
||||
|
||||
//
|
||||
// Override TurfAdjacent for AltClicking
|
||||
//
|
||||
|
||||
+18
-4
@@ -43,6 +43,9 @@
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"] && modifiers["ctrl"])
|
||||
CtrlShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
return
|
||||
@@ -98,8 +101,8 @@
|
||||
if(!resolved && A && W)
|
||||
W.afterattack(A,src,1,params) // 1 indicates adjacency
|
||||
else
|
||||
if(ismob(A))
|
||||
changeNext_move(8)
|
||||
//if(ismob(A))
|
||||
// changeNext_move(8)
|
||||
UnarmedAttack(A)
|
||||
return
|
||||
|
||||
@@ -117,8 +120,8 @@
|
||||
if(!resolved && A && W)
|
||||
W.afterattack(A,src,1,params) // 1: clicking something Adjacent
|
||||
else
|
||||
if(ismob(A))
|
||||
changeNext_move(8)
|
||||
//if(ismob(A))
|
||||
// changeNext_move(8)
|
||||
UnarmedAttack(A, 1)
|
||||
return
|
||||
else // non-adjacent click
|
||||
@@ -242,6 +245,17 @@
|
||||
/mob/proc/TurfAdjacent(var/turf/T)
|
||||
return T.Adjacent(src)
|
||||
|
||||
/*
|
||||
Control+Shift click
|
||||
Unused except for AI
|
||||
*/
|
||||
/mob/proc/CtrlShiftClickOn(var/atom/A)
|
||||
A.CtrlShiftClick(src)
|
||||
return
|
||||
|
||||
/atom/proc/CtrlShiftClick(var/mob/user)
|
||||
return
|
||||
|
||||
/*
|
||||
Misc helpers
|
||||
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"] && modifiers["ctrl"])
|
||||
CtrlShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
return
|
||||
@@ -87,6 +90,53 @@
|
||||
cycle_modules()
|
||||
return
|
||||
|
||||
//Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks
|
||||
// for non-doors/apcs
|
||||
/mob/living/silicon/robot/CtrlShiftClickOn(var/atom/A)
|
||||
A.BorgCtrlShiftClick(src)
|
||||
/mob/living/silicon/robot/ShiftClickOn(var/atom/A)
|
||||
A.BorgShiftClick(src)
|
||||
/mob/living/silicon/robot/CtrlClickOn(var/atom/A)
|
||||
A.BorgCtrlClick(src)
|
||||
/mob/living/silicon/robot/AltClickOn(var/atom/A)
|
||||
A.BorgAltClick(src)
|
||||
|
||||
/atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
|
||||
CtrlShiftClick(user)
|
||||
|
||||
/obj/machinery/door/airlock/BorgCtrlShiftClick() // Sets/Unsets Emergency Access Override Forwards to AI code.
|
||||
AICtrlShiftClick()
|
||||
|
||||
|
||||
/atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
|
||||
ShiftClick(user)
|
||||
|
||||
/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code.
|
||||
AIShiftClick()
|
||||
|
||||
|
||||
/atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
|
||||
CtrlClick(user)
|
||||
|
||||
/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code.
|
||||
AICtrlClick()
|
||||
|
||||
/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code.
|
||||
AICtrlClick()
|
||||
|
||||
/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code.
|
||||
AICtrlClick()
|
||||
|
||||
/atom/proc/BorgAltClick(var/mob/living/silicon/robot/user)
|
||||
AltClick(user)
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code.
|
||||
AIAltClick()
|
||||
|
||||
/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code.
|
||||
AIAltClick()
|
||||
|
||||
/*
|
||||
As with AI, these are not used in click code,
|
||||
because the code for robots is specific, not generic.
|
||||
|
||||
+1
-8
@@ -598,14 +598,7 @@ datum/mind
|
||||
log_admin("[key_name(usr)] has de-cult'ed [current].")
|
||||
if("cultist")
|
||||
if(!(src in ticker.mode.cult))
|
||||
ticker.mode.cult += src
|
||||
ticker.mode.update_cult_icons_added(src)
|
||||
special_role = "Cultist"
|
||||
current << "<font color=\"purple\"><b><i>You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.</b></i></font>"
|
||||
current << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||
var/datum/game_mode/cult/cult = ticker.mode
|
||||
if (istype(cult))
|
||||
cult.memorize_cult_objectives(src)
|
||||
ticker.mode.add_cultist(src)
|
||||
message_admins("[key_name_admin(usr)] has cult'ed [current].")
|
||||
log_admin("[key_name(usr)] has cult'ed [current].")
|
||||
if("tome")
|
||||
|
||||
@@ -123,7 +123,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "firefighting crate"
|
||||
|
||||
|
||||
/datum/supply_packs/emergency/atmostank
|
||||
name = "Firefighting Watertank"
|
||||
contains = list(/obj/item/weapon/watertank/atmos)
|
||||
@@ -748,7 +748,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containername = "hydroponics crate"
|
||||
|
||||
|
||||
/datum/supply_packs/misc/hydroponics/hydrotank
|
||||
name = "Hydroponics Watertank Backpack Crate"
|
||||
contains = list(/obj/item/weapon/watertank)
|
||||
@@ -900,7 +900,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
|
||||
/datum/supply_packs/misc/lasertag
|
||||
name = "LaserTag Crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/laser/redtag,
|
||||
contains = list(/obj/item/weapon/gun/energy/laser/redtag,
|
||||
/obj/item/weapon/gun/energy/laser/redtag,
|
||||
/obj/item/weapon/gun/energy/laser/redtag,
|
||||
/obj/item/weapon/gun/energy/laser/bluetag,
|
||||
@@ -917,10 +917,24 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 15
|
||||
containername = "LaserTag Crate"
|
||||
|
||||
/datum/supply_packs/misc/religious_supplies
|
||||
name = "Religious Supplies Crate"
|
||||
contains = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/item/weapon/storage/bible/booze,
|
||||
/obj/item/weapon/storage/bible/booze,
|
||||
/obj/item/clothing/suit/chaplain_hoodie,
|
||||
/obj/item/clothing/head/chaplain_hood,
|
||||
/obj/item/clothing/suit/chaplain_hoodie,
|
||||
/obj/item/clothing/head/chaplain_hood)
|
||||
cost = 40 // it costs so much because the Space Church is ran by Space Jews
|
||||
containername = "religious supplies crate"
|
||||
|
||||
|
||||
///////////// Paper Work
|
||||
|
||||
/datum/supply_packs/misc/paper
|
||||
name = "Bureaucracy crate"
|
||||
name = "Bureaucracy Crate"
|
||||
contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled,
|
||||
/obj/item/device/camera_film,
|
||||
/obj/item/weapon/hand_labeler,
|
||||
@@ -936,7 +950,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
/obj/item/weapon/clipboard,
|
||||
/obj/item/weapon/clipboard)
|
||||
cost = 15
|
||||
containername = "Bureaucracy crate"
|
||||
containername = "bureaucracy crate"
|
||||
|
||||
/datum/supply_packs/misc/toner
|
||||
name = "Toner Cartridges"
|
||||
@@ -977,7 +991,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "janitorial cart crate"
|
||||
|
||||
|
||||
/datum/supply_packs/misc/janitor/janitank
|
||||
name = "Janitor Watertank Backpack Crate"
|
||||
contains = list(/obj/item/weapon/watertank/janitor)
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
var/list/datum/mind/cult = list()
|
||||
var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
|
||||
var/list/grantwords = list("travel", "see", "hell", "tech", "destroy", "other", "hide")
|
||||
var/list/cult_objectives = list()
|
||||
|
||||
|
||||
/proc/iscultist(mob/living/M as mob)
|
||||
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
|
||||
@@ -13,6 +15,8 @@
|
||||
if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0
|
||||
if(isloyal(mind.current))
|
||||
return 0
|
||||
if (ticker.mode.name == "cult") //redundent?
|
||||
if(mind.current == ticker.mode.sacrifice_target) return 0
|
||||
return 1
|
||||
|
||||
|
||||
@@ -20,16 +24,15 @@
|
||||
name = "cult"
|
||||
config_tag = "cult"
|
||||
antag_flag = BE_CULTIST
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
|
||||
protected_jobs = list()
|
||||
required_players = 15
|
||||
required_enemies = 3
|
||||
recommended_enemies = 4
|
||||
required_players = 20
|
||||
required_enemies = 6
|
||||
recommended_enemies = 6
|
||||
|
||||
uplink_welcome = "Nar-Sie Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
var/datum/mind/sacrifice_target = null
|
||||
var/finished = 0
|
||||
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
||||
@@ -37,11 +40,9 @@
|
||||
var/list/startwords = list("blood","join","self","hell")
|
||||
var/list/secondwords = list("travel", "see", "tech", "destroy", "other", "hide")
|
||||
|
||||
var/list/objectives = list()
|
||||
|
||||
var/eldergod = 1 //for the summon god objective
|
||||
|
||||
var/const/acolytes_needed = 5 //for the survive objective
|
||||
var/acolytes_needed = 10 //for the survive objective
|
||||
var/acolytes_survived = 0
|
||||
|
||||
|
||||
@@ -52,11 +53,15 @@
|
||||
|
||||
/datum/game_mode/cult/pre_setup()
|
||||
if(prob(50))
|
||||
objectives += "survive"
|
||||
objectives += "sacrifice"
|
||||
cult_objectives += "survive"
|
||||
cult_objectives += "sacrifice"
|
||||
else
|
||||
objectives += "eldergod"
|
||||
objectives += "sacrifice"
|
||||
cult_objectives += "eldergod"
|
||||
cult_objectives += "sacrifice"
|
||||
|
||||
if(num_players() >= 30)
|
||||
recommended_enemies = 9 // 3+3+3 - d' magic number o' magic numbars mon
|
||||
acolytes_needed = 15
|
||||
|
||||
if(config.protect_roles_from_antagonist)
|
||||
restricted_jobs += protected_jobs
|
||||
@@ -79,7 +84,7 @@
|
||||
|
||||
/datum/game_mode/cult/post_setup()
|
||||
modePlayer += cult
|
||||
if("sacrifice" in objectives)
|
||||
if("sacrifice" in cult_objectives)
|
||||
var/list/possible_targets = get_unconvertables()
|
||||
|
||||
if(!possible_targets.len)
|
||||
@@ -110,9 +115,9 @@
|
||||
|
||||
|
||||
/datum/game_mode/cult/proc/memorize_cult_objectives(var/datum/mind/cult_mind)
|
||||
for(var/obj_count = 1,obj_count <= objectives.len,obj_count++)
|
||||
for(var/obj_count = 1,obj_count <= cult_objectives.len,obj_count++)
|
||||
var/explanation
|
||||
switch(objectives[obj_count])
|
||||
switch(cult_objectives[obj_count])
|
||||
if("survive")
|
||||
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
|
||||
if("sacrifice")
|
||||
@@ -124,11 +129,12 @@
|
||||
explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
|
||||
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
|
||||
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
|
||||
cult_mind.current << "The Geometer of Blood grants you the knowledge to convert non-believers. (Join Blood Self)"
|
||||
cult_mind.memory += "The Geometer of Blood grants you the knowledge to convert non-believers. (Join Blood Self)<BR>"
|
||||
grant_runeword(cult_mind.current,"join")
|
||||
grant_runeword(cult_mind.current,"blood")
|
||||
grant_runeword(cult_mind.current,"self")
|
||||
cult_mind.current << "The Geometer of Blood grants you the knowledge to sacrifice non-believers. (Hell Blood Join)"
|
||||
cult_mind.memory += "The Geometer of Blood grants you the knowledge to sacrifice non-believers. (Hell Blood Join)<BR>"
|
||||
for(var/startingword in startwords)
|
||||
grant_runeword(cult_mind.current,startingword)
|
||||
// grant_runeword(cult_mind.current,"blood")
|
||||
// grant_runeword(cult_mind.current,"hell")
|
||||
|
||||
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
|
||||
if(!istype(mob))
|
||||
@@ -214,6 +220,7 @@
|
||||
return 0
|
||||
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
|
||||
cult += cult_mind
|
||||
cult_mind.current.cult_add_comm()
|
||||
update_cult_icons_added(cult_mind)
|
||||
cult_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has been converted to the cult!</font>"
|
||||
return 1
|
||||
@@ -228,6 +235,7 @@
|
||||
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1)
|
||||
if(cult_mind in cult)
|
||||
cult -= cult_mind
|
||||
cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm
|
||||
cult_mind.current << "\red <FONT size = 3><B>An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.</B></FONT>"
|
||||
cult_mind.memory = ""
|
||||
cult_mind.cult_words = initial(cult_mind.cult_words)
|
||||
@@ -294,11 +302,11 @@
|
||||
|
||||
/datum/game_mode/cult/proc/check_cult_victory()
|
||||
var/cult_fail = 0
|
||||
if(objectives.Find("survive"))
|
||||
if(cult_objectives.Find("survive"))
|
||||
cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise
|
||||
if(objectives.Find("eldergod"))
|
||||
if(cult_objectives.Find("eldergod"))
|
||||
cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
|
||||
if(objectives.Find("sacrifice"))
|
||||
if(cult_objectives.Find("sacrifice"))
|
||||
if(sacrifice_target && !sacrificed.Find(sacrifice_target)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail
|
||||
cult_fail++
|
||||
|
||||
@@ -331,11 +339,11 @@
|
||||
|
||||
var/text = "<b>Cultists escaped:</b> [acolytes_survived]"
|
||||
|
||||
if(objectives.len)
|
||||
if(cult_objectives.len)
|
||||
text += "<br><b>The cultists' objectives were:</b>"
|
||||
for(var/obj_count=1, obj_count <= objectives.len, obj_count++)
|
||||
for(var/obj_count=1, obj_count <= cult_objectives.len, obj_count++)
|
||||
var/explanation
|
||||
switch(objectives[obj_count])
|
||||
switch(cult_objectives[obj_count])
|
||||
if("survive")
|
||||
if(!check_survive())
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. <font color='green'><B>Success!</B></font>"
|
||||
|
||||
@@ -24,6 +24,51 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
runerandom()
|
||||
usr << "[wordtravel] is travel, [wordblood] is blood, [wordjoin] is join, [wordhell] is Hell, [worddestr] is destroy, [wordtech] is technology, [wordself] is self, [wordsee] is see, [wordother] is other, [wordhide] is hide."
|
||||
|
||||
/mob/proc/cult_add_comm()
|
||||
verbs += /mob/living/proc/cult_innate_comm
|
||||
|
||||
/mob/living/proc/cult_innate_comm()
|
||||
set category = "Cultist"
|
||||
set name = "Communicate"
|
||||
|
||||
#define CHECK_STATUS (usr.stat || usr.restrained() || usr.paralysis || usr.stunned || usr.weakened)
|
||||
|
||||
if(!iscultist(usr)) //they shouldn't have this verb, but just to be sure...
|
||||
return
|
||||
|
||||
if(CHECK_STATUS)
|
||||
return //dead men tell no tales
|
||||
|
||||
var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")
|
||||
if(!input) // TO-DO: Add some kind of filter to corrupt the inputted text
|
||||
return
|
||||
|
||||
if(ishuman(usr) || ismonkey(usr)) //Damage only applies to humans and monkeys, to allow constructs to communicate
|
||||
usr.visible_message("<span class='warning'>[usr.name] starts clawing at his arms like a mad man!")
|
||||
apply_damage(25,BRUTE, "l_arm")
|
||||
apply_damage(25,BRUTE, "r_arm")
|
||||
sleep(50)
|
||||
if(CHECK_STATUS)
|
||||
return //Hard to drawn intrinsic symbols when you're bleeding out in your cell.
|
||||
var/turf/location = loc
|
||||
if(istype(location, /turf/simulated)) // tearing your arms apart is going to spill a bit of blood, in fact thats the idea
|
||||
location.add_blood(usr) // TO-DO change this to a badly drawn rune
|
||||
apply_damage(15,BRUTE, "l_arm") // does a metric fuck ton of damage because this meant to be an emergency method of communication.
|
||||
apply_damage(15,BRUTE, "r_arm")
|
||||
if(CHECK_STATUS)
|
||||
return //dead men tell no tales
|
||||
usr.visible_message("<span class='warning'>[usr.name] paints strange symbols with their own blood")
|
||||
sleep(20)
|
||||
|
||||
usr.say("O bidai nabora se[pick("'","`")]sma!")
|
||||
sleep(10)
|
||||
usr.say("[input]")
|
||||
for(var/datum/mind/H in ticker.mode.cult)
|
||||
if (H.current)
|
||||
H.current << "\red \b [input]"
|
||||
return
|
||||
#undef CHECK_STATUS
|
||||
|
||||
|
||||
/proc/runerandom() //randomizes word meaning
|
||||
var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed.
|
||||
@@ -134,7 +179,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
return
|
||||
|
||||
|
||||
attack_hand(mob/living/user as mob)
|
||||
attack_hand(mob/living/user as mob) // OH GOD this is horrible
|
||||
if(!iscultist(user))
|
||||
user << "<span class='notice'>You can't mouth the arcane scratchings without fumbling over them.</span>"
|
||||
return
|
||||
@@ -193,6 +238,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
return itemport(src.word3)
|
||||
if(word1 == wordjoin && word2 == wordhide && word3 == wordtech)
|
||||
return runestun()
|
||||
if(word1 == wordtravel && word2 == wordhell && word3 == wordtech)
|
||||
return summon_shell()
|
||||
else
|
||||
user.take_overall_damage(30, 0)
|
||||
user << "\red You feel the life draining from you, as if Lord Nar-Sie is displeased with you."
|
||||
@@ -311,6 +358,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
var/tomedat = ""
|
||||
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
|
||||
|
||||
|
||||
tomedat = {"<html>
|
||||
<head>
|
||||
<style>
|
||||
@@ -416,6 +464,11 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
switch(href_list["action"])
|
||||
if("clear")
|
||||
words[words[number]] = words[number]
|
||||
if("read")
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
usr << browse("[tomedat]", "window=Arcane Tome")
|
||||
return
|
||||
if("change")
|
||||
words[words[number]] = input("Enter the translation for [words[number]]", "Word notes") in engwords
|
||||
for (var/entry in words)
|
||||
@@ -473,6 +526,11 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
if(!iscultist(user))
|
||||
return ..()
|
||||
if(iscultist(M))
|
||||
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
|
||||
user << "\blue You remove the taint from [M]."
|
||||
var/holy2unholy = M.reagents.get_reagent_amount("holywater")
|
||||
M.reagents.del_reagent("holywater")
|
||||
M.reagents.add_reagent("unholywater",holy2unholy)
|
||||
return
|
||||
M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit
|
||||
for(var/mob/O in viewers(M, null))
|
||||
@@ -502,113 +560,123 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
|
||||
return
|
||||
else
|
||||
switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
|
||||
switch(alert("You open the tome",,"Commune","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
|
||||
if("Cancel")
|
||||
return
|
||||
if("Read it")
|
||||
if("Commune")
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
user << browse("[tomedat]", "window=Arcane Tome")
|
||||
var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")
|
||||
if(!input)
|
||||
return
|
||||
usr.whisper("O bidai nabora se[pick("'","`")]sma!")
|
||||
usr.whisper("[input]")
|
||||
for(var/datum/mind/H in ticker.mode.cult)
|
||||
if (H.current)
|
||||
H.current << "\red \b [input]"
|
||||
return
|
||||
if("Notes")
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
notedat = {"
|
||||
<br><b>Word translation notes</b> <br>
|
||||
[words[1]] is <a href='byond://?src=\ref[src];number=1;action=change'>[words[words[1]]]</A> <A href='byond://?src=\ref[src];number=1;action=clear'>Clear</A><BR>
|
||||
[words[2]] is <A href='byond://?src=\ref[src];number=2;action=change'>[words[words[2]]]</A> <A href='byond://?src=\ref[src];number=2;action=clear'>Clear</A><BR>
|
||||
[words[3]] is <a href='byond://?src=\ref[src];number=3;action=change'>[words[words[3]]]</A> <A href='byond://?src=\ref[src];number=3;action=clear'>Clear</A><BR>
|
||||
[words[4]] is <a href='byond://?src=\ref[src];number=4;action=change'>[words[words[4]]]</A> <A href='byond://?src=\ref[src];number=4;action=clear'>Clear</A><BR>
|
||||
[words[5]] is <a href='byond://?src=\ref[src];number=5;action=change'>[words[words[5]]]</A> <A href='byond://?src=\ref[src];number=5;action=clear'>Clear</A><BR>
|
||||
[words[6]] is <a href='byond://?src=\ref[src];number=6;action=change'>[words[words[6]]]</A> <A href='byond://?src=\ref[src];number=6;action=clear'>Clear</A><BR>
|
||||
[words[7]] is <a href='byond://?src=\ref[src];number=7;action=change'>[words[words[7]]]</A> <A href='byond://?src=\ref[src];number=7;action=clear'>Clear</A><BR>
|
||||
[words[8]] is <a href='byond://?src=\ref[src];number=8;action=change'>[words[words[8]]]</A> <A href='byond://?src=\ref[src];number=8;action=clear'>Clear</A><BR>
|
||||
[words[9]] is <a href='byond://?src=\ref[src];number=9;action=change'>[words[words[9]]]</A> <A href='byond://?src=\ref[src];number=9;action=clear'>Clear</A><BR>
|
||||
[words[10]] is <a href='byond://?src=\ref[src];number=10;action=change'>[words[words[10]]]</A> <A href='byond://?src=\ref[src];number=10;action=clear'>Clear</A><BR>
|
||||
"}
|
||||
<a href='byond://?src=\ref[src];action=read'>Read the Arcane Tome.</A></BR>
|
||||
<br><b>Word translation notes</b> <br>
|
||||
[words[1]] is <a href='byond://?src=\ref[src];number=1;action=change'>[words[words[1]]]</A> <A href='byond://?src=\ref[src];number=1;action=clear'>Clear</A><BR>
|
||||
[words[2]] is <A href='byond://?src=\ref[src];number=2;action=change'>[words[words[2]]]</A> <A href='byond://?src=\ref[src];number=2;action=clear'>Clear</A><BR>
|
||||
[words[3]] is <a href='byond://?src=\ref[src];number=3;action=change'>[words[words[3]]]</A> <A href='byond://?src=\ref[src];number=3;action=clear'>Clear</A><BR>
|
||||
[words[4]] is <a href='byond://?src=\ref[src];number=4;action=change'>[words[words[4]]]</A> <A href='byond://?src=\ref[src];number=4;action=clear'>Clear</A><BR>
|
||||
[words[5]] is <a href='byond://?src=\ref[src];number=5;action=change'>[words[words[5]]]</A> <A href='byond://?src=\ref[src];number=5;action=clear'>Clear</A><BR>
|
||||
[words[6]] is <a href='byond://?src=\ref[src];number=6;action=change'>[words[words[6]]]</A> <A href='byond://?src=\ref[src];number=6;action=clear'>Clear</A><BR>
|
||||
[words[7]] is <a href='byond://?src=\ref[src];number=7;action=change'>[words[words[7]]]</A> <A href='byond://?src=\ref[src];number=7;action=clear'>Clear</A><BR>
|
||||
[words[8]] is <a href='byond://?src=\ref[src];number=8;action=change'>[words[words[8]]]</A> <A href='byond://?src=\ref[src];number=8;action=clear'>Clear</A><BR>
|
||||
[words[9]] is <a href='byond://?src=\ref[src];number=9;action=change'>[words[words[9]]]</A> <A href='byond://?src=\ref[src];number=9;action=clear'>Clear</A><BR>
|
||||
[words[10]] is <a href='byond://?src=\ref[src];number=10;action=change'>[words[words[10]]]</A> <A href='byond://?src=\ref[src];number=10;action=clear'>Clear</A><BR>
|
||||
"} // whoever screwed the tabbing on this originally is an asshole.
|
||||
// call(/obj/item/weapon/tome/proc/edit_notes)()
|
||||
user << browse("[notedat]", "window=notes")
|
||||
return
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
if("Scribe a rune") //fixed more assbackward tabbing
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
|
||||
var/list/dictionary = list(
|
||||
"convert" = list("join","blood","self"),
|
||||
"wall" = list("destroy","travel","self"),
|
||||
"blood boil" = list("destroy","see","blood"),
|
||||
"blood drain" = list("travel","blood","self"),
|
||||
"raise dead" = list("blood","join","hell"),
|
||||
"summon narsie" = list("hell","join","self"),
|
||||
"communicate" = list("self","other","technology"),
|
||||
"emp" = list("destroy","see","technology"),
|
||||
"manifest" = list("blood","see","travel"),
|
||||
"summon tome" = list("see","blood","hell"),
|
||||
"see invisible" = list("see","hell","join"),
|
||||
"hide" = list("hide","see","blood"),
|
||||
"reveal" = list("blood","see","hide"),
|
||||
"astral journey" = list("hell","travel","self"),
|
||||
"imbue" = list("hell","technology","join"),
|
||||
"sacrifice" = list("hell","blood","join"),
|
||||
"summon cultist" = list("join","other","self"),
|
||||
"free cultist" = list("travel","technology","other"),
|
||||
"deafen" = list("hide","other","see"),
|
||||
"blind" = list("destroy","see","other"),
|
||||
"stun" = list("join","hide","technology"),
|
||||
"armor" = list("hell","destroy","other"),
|
||||
"teleport" = list("travel","self"),
|
||||
"teleport other" = list("travel","other")
|
||||
)
|
||||
var/list/dictionary = list(
|
||||
"convert" = list("join","blood","self"),
|
||||
"wall" = list("destroy","travel","self"),
|
||||
"blood boil" = list("destroy","see","blood"),
|
||||
"blood drain" = list("travel","blood","self"),
|
||||
"raise dead" = list("blood","join","hell"),
|
||||
"summon narsie" = list("hell","join","self"),
|
||||
"communicate" = list("self","other","technology"),
|
||||
"emp" = list("destroy","see","technology"),
|
||||
"manifest" = list("blood","see","travel"),
|
||||
"summon tome" = list("see","blood","hell"),
|
||||
"see invisible" = list("see","hell","join"),
|
||||
"hide" = list("hide","see","blood"),
|
||||
"reveal" = list("blood","see","hide"),
|
||||
"astral journey" = list("hell","travel","self"),
|
||||
"imbue" = list("hell","technology","join"),
|
||||
"sacrifice" = list("hell","blood","join"),
|
||||
"summon cultist" = list("join","other","self"),
|
||||
"free cultist" = list("travel","technology","other"),
|
||||
"deafen" = list("hide","other","see"),
|
||||
"blind" = list("destroy","see","other"),
|
||||
"stun" = list("join","hide","technology"),
|
||||
"armor" = list("hell","destroy","other"),
|
||||
"teleport" = list("travel","self"),
|
||||
"teleport other" = list("travel","other"),
|
||||
"summon shell" = list("travel","hell","technology")
|
||||
)
|
||||
|
||||
|
||||
var/list/scribewords = list("none")
|
||||
var/list/scribewords = list("none")
|
||||
|
||||
var/list/english = list()
|
||||
var/list/english = list()
|
||||
|
||||
for (var/entry in words)
|
||||
if (words[entry] != entry)
|
||||
english+=list(words[entry] = entry)
|
||||
for (var/entry in words)
|
||||
if (words[entry] != entry)
|
||||
english+=list(words[entry] = entry)
|
||||
|
||||
for (var/entry in dictionary)
|
||||
var/list/required = dictionary[entry]
|
||||
if (length(english&required) == required.len)
|
||||
scribewords += entry
|
||||
for (var/entry in dictionary)
|
||||
var/list/required = dictionary[entry]
|
||||
if (length(english&required) == required.len)
|
||||
scribewords += entry
|
||||
|
||||
var/chosen_rune = null
|
||||
var/chosen_rune = null
|
||||
|
||||
|
||||
if(usr)
|
||||
chosen_rune = input ("Choose a rune to scribe.") in scribewords
|
||||
if (!chosen_rune)
|
||||
return
|
||||
if (chosen_rune == "none")
|
||||
user << "\red You decide against scribing a rune, perhaps you should take this time to study your notes."
|
||||
return
|
||||
if (chosen_rune == "teleport")
|
||||
dictionary[chosen_rune] += input ("Choose a destination word") in english
|
||||
if (chosen_rune == "teleport other")
|
||||
dictionary[chosen_rune] += input ("Choose a destination word") in english
|
||||
if(usr)
|
||||
chosen_rune = input ("Choose a rune to scribe.") in scribewords
|
||||
if (!chosen_rune)
|
||||
return
|
||||
if (chosen_rune == "none")
|
||||
user << "\red You decide against scribing a rune, perhaps you should take this time to study your notes."
|
||||
return
|
||||
if (chosen_rune == "teleport")
|
||||
dictionary[chosen_rune] += input ("Choose a destination word") in english
|
||||
if (chosen_rune == "teleport other")
|
||||
dictionary[chosen_rune] += input ("Choose a destination word") in english
|
||||
|
||||
if(user.get_active_hand() != src)
|
||||
return
|
||||
if(user.get_active_hand() != src)
|
||||
return
|
||||
|
||||
for (var/mob/V in viewers(src))
|
||||
V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2)
|
||||
user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
|
||||
user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
|
||||
if(do_after(user, 50))
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
|
||||
user << "\red You finish drawing the arcane markings of the Geometer."
|
||||
var/list/required = dictionary[chosen_rune]
|
||||
R.word1 = english[required[1]]
|
||||
R.word2 = english[required[2]]
|
||||
R.word3 = english[required[3]]
|
||||
R.check_icon()
|
||||
R.blood_DNA = list()
|
||||
R.blood_DNA[H.dna.unique_enzymes] = H.dna.blood_type
|
||||
return
|
||||
for (var/mob/V in viewers(src))
|
||||
V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2)
|
||||
user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
|
||||
user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
|
||||
if(do_after(user, 50))
|
||||
if(usr.get_active_hand() != src)
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
|
||||
user << "\red You finish drawing the arcane markings of the Geometer."
|
||||
var/list/required = dictionary[chosen_rune]
|
||||
R.word1 = english[required[1]]
|
||||
R.word2 = english[required[2]]
|
||||
R.word3 = english[required[3]]
|
||||
R.check_icon()
|
||||
R.blood_DNA = list()
|
||||
R.blood_DNA[H.dna.unique_enzymes] = H.dna.blood_type
|
||||
return
|
||||
else
|
||||
user << "The book seems full of illegible scribbles. Is this a joke?"
|
||||
return
|
||||
@@ -648,7 +716,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
var/r
|
||||
if (!istype(user.loc,/turf))
|
||||
user << "\red You do not have enough space to write a proper rune."
|
||||
var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun")
|
||||
var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun", "summon shell")
|
||||
r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable.
|
||||
var/obj/effect/rune/R = new /obj/effect/rune
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
@@ -808,3 +876,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
R.word3=wordtech
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
if("summon shell")
|
||||
R.word1=wordtravel
|
||||
R.word2=wordhell
|
||||
R.word3=wordtech
|
||||
R.loc = user.loc
|
||||
R.check_icon()
|
||||
|
||||
@@ -99,40 +99,52 @@ var/list/sacrificed = list()
|
||||
/////////////////////////////////////////THIRD RUNE
|
||||
|
||||
convert()
|
||||
var/list/mob/living/carbon/human/cultsinrange = list()
|
||||
for(var/mob/living/carbon/M in src.loc)
|
||||
if(iscultist(M))
|
||||
continue
|
||||
if(M.stat==2)
|
||||
continue
|
||||
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
|
||||
M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
|
||||
"\red AAAAAAHHHH!.", \
|
||||
"\red You hear an anguished scream.")
|
||||
if(is_convertable_to_cult(M.mind))
|
||||
ticker.mode.add_cultist(M.mind)
|
||||
M.mind.special_role = "Cultist"
|
||||
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||
//picking which word to use
|
||||
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
|
||||
var/convert_word
|
||||
for(var/i=1, i<=3, i++)
|
||||
convert_word = pick(ticker.mode.grantwords)
|
||||
if(convert_word in usr.mind.cult_words)
|
||||
if(i==3) convert_word = null //NOTE: If max loops is changed ensure this condition is changed to match /Mal
|
||||
for(var/mob/living/carbon/C in orange(1,src))
|
||||
if(iscultist(C) && !C.stat) //converting requires three cultists
|
||||
cultsinrange += C
|
||||
C.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
|
||||
if(cultsinrange.len >= 3)
|
||||
M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
|
||||
"\red AAAAAAHHHH!.", \
|
||||
"\red You hear an anguished scream.")
|
||||
if(is_convertable_to_cult(M.mind))
|
||||
ticker.mode.add_cultist(M.mind)
|
||||
M.mind.special_role = "Cultist"
|
||||
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||
/* //convert no longer gives words
|
||||
//picking which word to use
|
||||
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
|
||||
var/convert_word
|
||||
for(var/i=1, i<=3, i++)
|
||||
convert_word = pick(ticker.mode.grantwords)
|
||||
if(convert_word in usr.mind.cult_words)
|
||||
if(i==3) convert_word = null //NOTE: If max loops is changed ensure this condition is changed to match /Mal
|
||||
else
|
||||
break
|
||||
if(!convert_word)
|
||||
usr << "\red This Convert was unworthy of knowledge of the other side!"
|
||||
else
|
||||
break
|
||||
if(!convert_word)
|
||||
usr << "\red This Convert was unworthy of knowledge of the other side!"
|
||||
else
|
||||
usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers."
|
||||
ticker.mode.grant_runeword(usr, convert_word)
|
||||
return 1
|
||||
usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers."
|
||||
ticker.mode.grant_runeword(usr, convert_word)
|
||||
return 1 */
|
||||
else
|
||||
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||
M << "<font color=\"red\"><b>And not a single fuck was given, exterminate the cult at all costs.</b></font>"
|
||||
if(ticker.mode.name == "cult")
|
||||
if(M.mind == ticker.mode.sacrifice_target)
|
||||
for(var/mob/living/carbon/human/cultist in cultsinrange)
|
||||
cultist << "<span class='h2.userdanger'>The Chosen One!! <BR>KILL THE CHOSEN ONE!!! </span>"
|
||||
return 0
|
||||
else
|
||||
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||
M << "<font color=\"red\"><b>And not a single fuck was given, exterminate the cult at all costs.</b></font>"
|
||||
return 0
|
||||
|
||||
for(var/mob/living/carbon/human/cultist in cultsinrange)
|
||||
cultist << "<span class='warning'>You need more brothers to overcome their lies and make them see Truth. </span>"
|
||||
return fizzle()
|
||||
|
||||
|
||||
@@ -140,12 +152,21 @@ var/list/sacrificed = list()
|
||||
/////////////////////////////////////////FOURTH RUNE
|
||||
|
||||
tearreality()
|
||||
var/cultist_count = 0
|
||||
var/list/mob/living/carbon/human/cultist_count = list()
|
||||
for(var/mob/M in range(1,src))
|
||||
if(iscultist(M) && !M.stat)
|
||||
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
|
||||
cultist_count += 1
|
||||
if(cultist_count >= 9)
|
||||
cultist_count += M
|
||||
if(cultist_count.len >= 9)
|
||||
if(ticker.mode.name == "cult")
|
||||
if("eldergod" in ticker.mode.cult_objectives)
|
||||
ticker.mode:eldergod = 0
|
||||
else
|
||||
message_admins("[usr.real_name]([usr.ckey]) tried to summon a god when she didn't want to come out to play.") // Admin alert because you *KNOW* dickbutts are going to abuse this.
|
||||
for(var/mob/M in cultist_count)
|
||||
M.reagents.add_reagent("hell_water", 10)
|
||||
M << "<span class='h2.userdanger'>YOUR SOUL BURNS WITH YOUR ARROGANCE!!!</span>"
|
||||
return
|
||||
var/narsie_type = /obj/machinery/singularity/narsie/large
|
||||
// Moves narsie if she was already summoned.
|
||||
var/obj/her = locate(narsie_type, machines)
|
||||
@@ -154,8 +175,6 @@ var/list/sacrificed = list()
|
||||
return
|
||||
// Otherwise...
|
||||
new narsie_type(src.loc) // Summon her!
|
||||
if(ticker.mode.name == "cult")
|
||||
ticker.mode:eldergod = 0
|
||||
qdel(src) // Stops cultists from spamming the rune to summon narsie more than once.
|
||||
// Might actually be wise to straight up del() this
|
||||
return
|
||||
@@ -584,107 +603,91 @@ var/list/sacrificed = list()
|
||||
if(iscultist(C) && !C.stat)
|
||||
cultsinrange += C
|
||||
C.say("Barhah hra zar[pick("'","`")]garis!")
|
||||
if(cultsinrange.len >= 3) break //we only need to check for three alive cultists, loop breaks so their aren't extra cultists getting word rewards
|
||||
for(var/mob/H in victims)
|
||||
if (ticker.mode.name == "cult")
|
||||
if(H.mind == ticker.mode:sacrifice_target)
|
||||
if(cultsinrange.len >= 3)
|
||||
sacrificed += H.mind
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
|
||||
usr << "\red He is pleased!"
|
||||
sac_grant_word()
|
||||
sac_grant_word()
|
||||
sac_grant_word() //Little reward for completing the objective
|
||||
stone_or_gib(H)
|
||||
for(var/mob/living/carbon/C in cultsinrange)
|
||||
C << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
|
||||
C << "\red He is pleased!"
|
||||
sac_grant_word(C)
|
||||
sac_grant_word(C)
|
||||
sac_grant_word(C) //Little reward for completing the objective
|
||||
else
|
||||
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
|
||||
else
|
||||
if(cultsinrange.len >= 3)
|
||||
if(H.stat !=2)
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice."
|
||||
sac_grant_word()
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
for(var/mob/living/carbon/C in cultsinrange)
|
||||
C << "\red The Geometer of Blood accepts this sacrifice."
|
||||
sac_grant_word(C)
|
||||
stone_or_gib(H)
|
||||
else
|
||||
if(prob(60))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
sac_grant_word()
|
||||
sac_grant_word(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
stone_or_gib(H)
|
||||
else
|
||||
if(H.stat !=2)
|
||||
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
|
||||
else
|
||||
if(prob(60))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
sac_grant_word()
|
||||
sac_grant_word(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
stone_or_gib(H)
|
||||
else
|
||||
if(cultsinrange.len >= 3)
|
||||
if(H.stat !=2)
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice."
|
||||
sac_grant_word()
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
for(var/mob/living/carbon/C in cultsinrange)
|
||||
C << "\red The Geometer of Blood accepts this sacrifice."
|
||||
sac_grant_word(C)
|
||||
stone_or_gib(H)
|
||||
else
|
||||
if(prob(60))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
sac_grant_word()
|
||||
sac_grant_word(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
stone_or_gib(H)
|
||||
else
|
||||
if(H.stat !=2)
|
||||
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
|
||||
else
|
||||
if(prob(60))
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
sac_grant_word()
|
||||
sac_grant_word(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere dead body is not enough to satisfy Him."
|
||||
if(isrobot(H))
|
||||
H.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
H.gib()
|
||||
stone_or_gib(H)
|
||||
for(var/mob/living/carbon/monkey/M in src.loc)
|
||||
if (ticker.mode.name == "cult")
|
||||
if(M.mind == ticker.mode:sacrifice_target)
|
||||
if(cultsinrange.len >= 3)
|
||||
sacrificed += M.mind
|
||||
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
|
||||
usr << "\red He is pleased!"
|
||||
sac_grant_word()
|
||||
sac_grant_word()
|
||||
sac_grant_word() //Little reward for completing the objective
|
||||
for(var/mob/living/carbon/C in cultsinrange)
|
||||
C << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
|
||||
C << "\red He is pleased!"
|
||||
sac_grant_word(C)
|
||||
sac_grant_word(C)
|
||||
sac_grant_word(C) //Little reward for completing the objective
|
||||
else
|
||||
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
|
||||
continue
|
||||
else
|
||||
if(prob(30))
|
||||
usr << "\red The Geometer of Blood accepts your meager sacrifice."
|
||||
sac_grant_word()
|
||||
sac_grant_word(usr)
|
||||
else
|
||||
usr << "\red The Geometer of blood accepts this sacrifice."
|
||||
usr << "\red However, a mere monkey is not enough to satisfy Him."
|
||||
@@ -692,7 +695,9 @@ var/list/sacrificed = list()
|
||||
usr << "\red The Geometer of Blood accepts your meager sacrifice."
|
||||
if(prob(30))
|
||||
ticker.mode.grant_runeword(usr)
|
||||
M.gib()
|
||||
stone_or_gib(M)
|
||||
for(var/mob/victim in src.loc) //TO-DO: Move the shite above into the mob's own sac_act - see /mob/living/simple_animal/corgi/sac_act for an example
|
||||
victim.sac_act(src, victim) //Sacrifice procs are now seperate per mob, this allows us to allow sacrifice on as many mob types as we want without making an already clunky system worse
|
||||
/* for(var/mob/living/carbon/alien/A)
|
||||
for(var/mob/K in cultsinrange)
|
||||
K.say("Barhah hra zar'garis!")
|
||||
@@ -709,12 +714,22 @@ var/list/sacrificed = list()
|
||||
return
|
||||
return fizzle() */
|
||||
|
||||
sac_grant_word() //The proc that which chooses a word rewarded for a successful sacrifice, sacrifices always give a currently unknown word if the normal checks pass
|
||||
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
|
||||
sac_grant_word(var/mob/living/C) //The proc that which chooses a word rewarded for a successful sacrifice, sacrifices always give a currently unknown word if the normal checks pass
|
||||
if(C.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
|
||||
var/convert_word
|
||||
var/pick_list = ticker.mode.allwords - usr.mind.cult_words
|
||||
var/pick_list = ticker.mode.allwords - C.mind.cult_words
|
||||
convert_word = pick(pick_list)
|
||||
ticker.mode.grant_runeword(usr, convert_word)
|
||||
ticker.mode.grant_runeword(C, convert_word)
|
||||
|
||||
stone_or_gib(var/mob/T)
|
||||
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
|
||||
if(!stone.transfer_soul("FORCE", T, usr)) //if it fails to add soul
|
||||
qdel(stone)
|
||||
if(T)
|
||||
if(isrobot(T))
|
||||
T.dust()//To prevent the MMI from remaining
|
||||
else
|
||||
T.gib()
|
||||
|
||||
|
||||
/////////////////////////////////////////SIXTEENTH RUNE
|
||||
@@ -1070,3 +1085,15 @@ var/list/sacrificed = list()
|
||||
|
||||
qdel(src)
|
||||
|
||||
summon_shell() // Summons a construct shell
|
||||
for(var/obj/item/stack/sheet/plasteel/PS in src.loc) //I could probably combine the amounts but I'm too lazy to compensate for others' lazyness
|
||||
if(PS.amount >= 4) // may need increasing?
|
||||
usr.say("Eth ra p'ni[pick("'","`")]dedo ol!") //I have no idea if these are written in a proper made up language or just Urist smacking his face on the keyboard
|
||||
new /obj/structure/constructshell(src.loc)
|
||||
//? PS.remove_amount(4) //TO-DO: Write a proc for removing sheets from a stack and deleting when stack is empty... why doesnt this exist yet??
|
||||
PS.amount -= 4
|
||||
if(PS.amount <= 0)
|
||||
qdel(PS)
|
||||
qdel(src)
|
||||
return 1
|
||||
return fizzle()
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
attack(mob/living/carbon/T as mob, mob/living/user as mob)
|
||||
if(iscultist(user))
|
||||
if(imbue == "runestun")
|
||||
user.take_organ_damage(5, 0)
|
||||
user.take_organ_damage(10, 0)
|
||||
call(/obj/effect/rune/proc/runestun)(T)
|
||||
user.drop_item(src)
|
||||
qdel(src)
|
||||
@@ -130,4 +130,4 @@
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply
|
||||
imbue = "supply"
|
||||
uses = 5
|
||||
uses = 3
|
||||
@@ -31,6 +31,7 @@
|
||||
var/uplink_welcome = "Syndicate Uplink Console:"
|
||||
var/uplink_uses = 10
|
||||
var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag
|
||||
var/datum/mind/sacrifice_target = null
|
||||
|
||||
|
||||
/datum/game_mode/proc/announce() //to be calles when round starts
|
||||
@@ -47,9 +48,13 @@
|
||||
if(playerC < required_players)
|
||||
return 0
|
||||
antag_candidates = get_players_for_role(antag_flag)
|
||||
if(antag_candidates.len < required_enemies)
|
||||
return 0
|
||||
return 1
|
||||
if(!Debug2)
|
||||
if(antag_candidates.len < required_enemies)
|
||||
return 0
|
||||
return 1
|
||||
else
|
||||
world << "<span class='notice'>DEBUG: GAME STARTING WITHOUT PLAYER NUMBER CHECKS, THIS WILL PROBABLY BREAK SHIT."
|
||||
return 1
|
||||
|
||||
|
||||
///pre_setup()
|
||||
|
||||
@@ -94,12 +94,15 @@ var/global/datum/controller/gameticker/ticker
|
||||
job_master.DivideOccupations() //Distribute jobs
|
||||
if (!src.mode.pre_setup_before_jobs) can_continue = src.mode.pre_setup()
|
||||
|
||||
if(!can_continue)
|
||||
del(mode)
|
||||
current_state = GAME_STATE_PREGAME
|
||||
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
|
||||
job_master.ResetOccupations()
|
||||
return 0
|
||||
if(!Debug2)
|
||||
if(!can_continue)
|
||||
del(mode)
|
||||
current_state = GAME_STATE_PREGAME
|
||||
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
|
||||
job_master.ResetOccupations()
|
||||
return 0
|
||||
else
|
||||
world << "<span class='notice'>DEBUG: Bypassing prestart checks..."
|
||||
|
||||
if(hide_mode)
|
||||
var/list/modes = new
|
||||
|
||||
@@ -91,9 +91,30 @@
|
||||
|
||||
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
|
||||
switch(choice)
|
||||
if("FORCE")
|
||||
if(!iscarbon(target)) //TO-DO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul
|
||||
return 0
|
||||
var/mob/living/carbon/T = target
|
||||
var/obj/item/device/soulstone/C = src
|
||||
if(T.client != null)
|
||||
if(C.contents.len)
|
||||
return 0
|
||||
else
|
||||
for(var/obj/item/W in T)
|
||||
T.unEquip(W)
|
||||
init_shade(C, T, U)
|
||||
//qdel T //Gib instead
|
||||
return 1
|
||||
return 0
|
||||
if("VICTIM")
|
||||
var/mob/living/carbon/human/T = target
|
||||
var/obj/item/device/soulstone/C = src
|
||||
if(ticker.mode.name == "cult" && T.mind == ticker.mode:sacrifice_target)
|
||||
if(iscultist(U))
|
||||
U << "\red The Geometer of blood wants this mortal sacrificed with the rune."
|
||||
else
|
||||
U << "\red The soul stone doesn't work for no apparent reason."
|
||||
return 0
|
||||
if(C.imprinted != "empty")
|
||||
U << "\red <b>Capture failed!</b>: \black The soul stone has already been imprinted with [C.imprinted]'s mind!"
|
||||
else
|
||||
@@ -108,29 +129,7 @@
|
||||
else
|
||||
for(var/obj/item/W in T)
|
||||
T.unEquip(W)
|
||||
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
|
||||
T.invisibility = 101
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = T
|
||||
flick("dust-h", animation)
|
||||
qdel(animation)
|
||||
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
|
||||
S.loc = C //put shade in stone
|
||||
S.status_flags |= GODMODE //So they won't die inside the stone somehow
|
||||
S.canmove = 0//Can't move out of the soul stone
|
||||
S.name = "Shade of [T.real_name]"
|
||||
S.real_name = "Shade of [T.real_name]"
|
||||
if (T.client)
|
||||
T.client.mob = S
|
||||
S.cancel_camera()
|
||||
C.icon_state = "soulstone2"
|
||||
C.name = "Soul Stone: [S.real_name]"
|
||||
S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
|
||||
U << "\blue <b>Capture successful!</b>: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
|
||||
U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
|
||||
C.imprinted = "[S.name]"
|
||||
init_shade(C, T, U, vic = 1)
|
||||
qdel(T)
|
||||
if("SHADE")
|
||||
var/mob/living/simple_animal/shade/T = target
|
||||
@@ -150,7 +149,8 @@
|
||||
T.health = T.maxHealth
|
||||
C.icon_state = "soulstone2"
|
||||
T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
|
||||
U << "\blue <b>Capture successful!</b>: \black [T.name]'s has been recaptured and stored within the soul stone."
|
||||
if(U != T)
|
||||
U << "\blue <b>Capture successful!</b>: \black [T.name]'s has been recaptured and stored within the soul stone."
|
||||
if("CONSTRUCT")
|
||||
var/obj/structure/constructshell/T = target
|
||||
var/obj/item/device/soulstone/C = src
|
||||
@@ -205,3 +205,29 @@
|
||||
else
|
||||
U << "\red <b>Creation failed!</b>: \black The soul stone is empty! Go kill someone!"
|
||||
return
|
||||
|
||||
obj/item/proc/init_shade(var/obj/item/device/soulstone/C, var/mob/living/carbon/human/T, var/mob/U as mob, var/vic = 0)
|
||||
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
|
||||
T.invisibility = 101
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = T
|
||||
flick("dust-h", animation)
|
||||
qdel(animation)
|
||||
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
|
||||
S.loc = C //put shade in stone
|
||||
S.status_flags |= GODMODE //So they won't die inside the stone somehow
|
||||
S.canmove = 0//Can't move out of the soul stone
|
||||
S.name = "Shade of [T.real_name]"
|
||||
S.real_name = "Shade of [T.real_name]"
|
||||
S.key = T.key
|
||||
ticker.mode.add_cultist(S.mind,2)
|
||||
S.cancel_camera()
|
||||
C.icon_state = "soulstone2"
|
||||
C.name = "Soul Stone: [S.real_name]"
|
||||
S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
|
||||
C.imprinted = "[S.name]"
|
||||
if(vic)
|
||||
U << "\blue <b>Capture successful!</b>: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
|
||||
U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
|
||||
|
||||
@@ -110,6 +110,11 @@
|
||||
var/water2holy = A.reagents.get_reagent_amount("water")
|
||||
A.reagents.del_reagent("water")
|
||||
A.reagents.add_reagent("holywater",water2holy)
|
||||
if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me
|
||||
user << "\blue You purify [A]."
|
||||
var/unholy2clean = A.reagents.get_reagent_amount("unholywater")
|
||||
A.reagents.del_reagent("unholywater")
|
||||
A.reagents.add_reagent("cleaner",unholy2clean) //it cleans their soul, get it? I'll get my coat...
|
||||
|
||||
/obj/item/weapon/storage/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
playsound(src.loc, "rustle", 50, 1, -5)
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
/mob/living/carbon/human/movement_delay()
|
||||
if(!has_gravity(src))
|
||||
return -1 //It's hard to be slowed down in space by... anything
|
||||
if(reagents.has_reagent("hyperzine"))
|
||||
return -1
|
||||
if(reagents.has_reagent("nuka_cola"))
|
||||
else if(status_flags & GOTTAGOFAST)
|
||||
return -1
|
||||
|
||||
. = 0
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
|
||||
|
||||
/mob/living/silicon/robot/Login()
|
||||
..()
|
||||
regenerate_icons()
|
||||
show_laws(0)
|
||||
if(mind) ticker.mode.remove_revolutionary(mind)
|
||||
|
||||
winset(src, null, "mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")
|
||||
|
||||
return
|
||||
@@ -125,6 +125,7 @@
|
||||
mmi = null
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/silicon/robot/proc/pick_module()
|
||||
if(module)
|
||||
return
|
||||
@@ -240,6 +241,18 @@
|
||||
set name = "Show Alerts"
|
||||
robot_alerts()
|
||||
|
||||
//for borg hotkeys, here module refers to borg inv slot, not core module
|
||||
/mob/living/silicon/robot/verb/cmd_toggle_module(module as num)
|
||||
set name = "Toggle Module"
|
||||
set hidden = 1
|
||||
toggle_module(module)
|
||||
|
||||
/mob/living/silicon/robot/verb/cmd_unequip_module()
|
||||
set name = "Unequip Module"
|
||||
set hidden = 1
|
||||
uneq_active()
|
||||
|
||||
|
||||
/mob/living/silicon/robot/proc/robot_alerts()
|
||||
var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
|
||||
dat += "<A HREF='?src=\ref[src];mach_close=robotalerts'>Close</A><BR><BR>"
|
||||
|
||||
@@ -29,6 +29,12 @@
|
||||
..()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/corgi/sac_act(var/obj/effect/rune/R, victim)
|
||||
usr << "<span class='warning'>Even dark gods from another plane have standards, sicko.</span>"
|
||||
usr.reagents.add_reagent("hell_water", 2)
|
||||
R.stone_or_gib(victim)
|
||||
|
||||
|
||||
/mob/living/simple_animal/corgi/show_inv(mob/user as mob)
|
||||
user.set_machine(src)
|
||||
if(user.stat) return
|
||||
|
||||
@@ -47,4 +47,6 @@
|
||||
if(isobj(loc))
|
||||
var/obj/Loc=loc
|
||||
Loc.on_log()
|
||||
//set macro to normal incase it was overriden (like cyborg currently does)
|
||||
winset(src, null, "mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")
|
||||
|
||||
|
||||
+806
-801
File diff suppressed because it is too large
Load Diff
@@ -312,11 +312,19 @@ datum
|
||||
del(A)
|
||||
update_total()
|
||||
my_atom.on_reagent_change()
|
||||
check_gofast(my_atom)
|
||||
return 0
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
check_gofast(var/mob/M)
|
||||
if(istype(M, /mob))
|
||||
if(M.reagents.has_reagent("hyperzine")||M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola"))
|
||||
return 1
|
||||
else
|
||||
M.status_flags &= ~GOTTAGOFAST
|
||||
|
||||
update_total()
|
||||
total_volume = 0
|
||||
for(var/datum/reagent/R in reagent_list)
|
||||
|
||||
@@ -263,14 +263,22 @@ datum
|
||||
if(!data) data = 1
|
||||
data++
|
||||
M.jitteriness = max(M.jitteriness-5,0)
|
||||
if(data >= 30)
|
||||
if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec
|
||||
if (!M.stuttering) M.stuttering = 1
|
||||
M.stuttering += 4
|
||||
M.Dizzy(5)
|
||||
if(data >= 30*2.5 && prob(33))
|
||||
if(iscultist(M) && prob(5))
|
||||
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
|
||||
if(data >= 75 && prob(33)) // 30 units, 135 seconds
|
||||
if (!M.confused) M.confused = 1
|
||||
M.confused += 3
|
||||
..()
|
||||
if(iscultist(M))
|
||||
ticker.mode.remove_cultist(M.mind)
|
||||
holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
|
||||
M.jitteriness = 0
|
||||
M.stuttering = 0
|
||||
M.confused = 0
|
||||
holder.remove_reagent(src.id, 0.4) //fixed consumption to prevent balancing going out of whack
|
||||
return
|
||||
|
||||
reaction_turf(var/turf/simulated/T, var/volume)
|
||||
@@ -281,6 +289,39 @@ datum
|
||||
qdel(R)
|
||||
T.Bless()
|
||||
|
||||
fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
|
||||
name = "Unholy Water"
|
||||
id = "unholywater"
|
||||
description = "Something that shouldn't exist on this plane of existance."
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
M.adjustBrainLoss(3)
|
||||
if(iscultist(M))
|
||||
M.status_flags |= GOTTAGOFAST
|
||||
M.drowsyness = max(M.drowsyness-5, 0)
|
||||
M.AdjustParalysis(-2)
|
||||
M.AdjustStunned(-2)
|
||||
M.AdjustWeakened(-2)
|
||||
else
|
||||
M.adjustToxLoss(2)
|
||||
M.adjustFireLoss(2)
|
||||
M.adjustOxyLoss(2)
|
||||
M.adjustBruteLoss(2)
|
||||
holder.remove_reagent(src.id, 1)
|
||||
|
||||
plasma/hellwater //if someone has this in their system they've really pissed off an eldrich god
|
||||
name = "Hell Water"
|
||||
id = "hell_water"
|
||||
description = "YOUR FLESH! IT BURNS!"
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
M.fire_stacks = min(5,M.fire_stacks + 3)
|
||||
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
|
||||
M.adjustToxLoss(1)
|
||||
M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard?
|
||||
M.adjustBrainLoss(5)
|
||||
holder.remove_reagent(src.id, 1)
|
||||
|
||||
lube
|
||||
name = "Space Lube"
|
||||
id = "lube"
|
||||
@@ -1091,8 +1132,9 @@ datum
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(prob(5)) M.emote(pick("twitch","blink_r","shiver"))
|
||||
M.status_flags |= GOTTAGOFAST
|
||||
holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
|
||||
..()
|
||||
// ..() //this was causing hyperzine to be consumed twice...
|
||||
return
|
||||
|
||||
cryoxadone
|
||||
@@ -2484,6 +2526,7 @@ datum
|
||||
M.dizziness +=5
|
||||
M.drowsyness = 0
|
||||
M.sleeping = max(0,M.sleeping-2)
|
||||
M.status_flags |= GOTTAGOFAST
|
||||
if (M.bodytemperature > 310)//310 is the normal bodytemp. 310.055
|
||||
M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
|
||||
M.nutrition += 1
|
||||
|
||||
+58
-9
@@ -35,6 +35,21 @@
|
||||
set name = "hotkeys-help"
|
||||
set category = "OOC"
|
||||
|
||||
var/adminhotkeys = {"<font color='purple'>
|
||||
Admin:
|
||||
\tF5 = Aghost (admin-ghost)
|
||||
\tF6 = player-panel-new
|
||||
\tF7 = admin-pm
|
||||
\tF8 = Invisimin
|
||||
</font>"}
|
||||
|
||||
mob.hotkey_help()
|
||||
|
||||
if(holder)
|
||||
src << adminhotkeys
|
||||
|
||||
|
||||
/mob/proc/hotkey_help()
|
||||
var/hotkey_mode = {"<font color='purple'>
|
||||
Hotkey-Mode: (hotkey-mode must be on)
|
||||
\tTAB = toggle hotkey-mode
|
||||
@@ -81,15 +96,49 @@ Any-Mode: (hotkey doesn't need to be on)
|
||||
\tEND = throw
|
||||
</font>"}
|
||||
|
||||
var/admin = {"<font color='purple'>
|
||||
Admin:
|
||||
\tF5 = Aghost (admin-ghost)
|
||||
\tF6 = player-panel-new
|
||||
\tF7 = admin-pm
|
||||
\tF8 = Invisimin
|
||||
src << hotkey_mode
|
||||
src << other
|
||||
|
||||
/mob/living/silicon/robot/hotkey_help()
|
||||
var/hotkey_mode = {"<font color='purple'>
|
||||
Hotkey-Mode: (hotkey-mode must be on)
|
||||
\tTAB = toggle hotkey-mode
|
||||
\ta = left
|
||||
\ts = down
|
||||
\td = right
|
||||
\tw = up
|
||||
\tq = unequip active module
|
||||
\tt = say
|
||||
\tx = cycle active modules
|
||||
\tz = activate held object (or y)
|
||||
\tf = cycle-intents-left
|
||||
\tg = cycle-intents-right
|
||||
\t1 = activate module 1
|
||||
\t2 = activate module 2
|
||||
\t3 = activate module 3
|
||||
\t4 = toggle intents
|
||||
</font>"}
|
||||
|
||||
var/other = {"<font color='purple'>
|
||||
Any-Mode: (hotkey doesn't need to be on)
|
||||
\tCtrl+a = left
|
||||
\tCtrl+s = down
|
||||
\tCtrl+d = right
|
||||
\tCtrl+w = up
|
||||
\tCtrl+q = unequip active module
|
||||
\tCtrl+x = cycle active modules
|
||||
\tCtrl+z = activate held object (or Ctrl+y)
|
||||
\tCtrl+f = cycle-intents-left
|
||||
\tCtrl+g = cycle-intents-right
|
||||
\tCtrl+1 = activate module 1
|
||||
\tCtrl+2 = activate module 2
|
||||
\tCtrl+3 = activate module 3
|
||||
\tCtrl+4 = toggle intents
|
||||
\tDEL = pull
|
||||
\tINS = toggle intents
|
||||
\tPGUP = cycle active modules
|
||||
\tPGDN = activate held object
|
||||
</font>"}
|
||||
|
||||
src << hotkey_mode
|
||||
src << other
|
||||
if(holder)
|
||||
src << admin
|
||||
src << other
|
||||
@@ -1,3 +1,217 @@
|
||||
macro "borghotkeymode"
|
||||
elem
|
||||
name = "TAB"
|
||||
command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5\""
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CENTER+REP"
|
||||
command = ".center"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "NORTHEAST"
|
||||
command = ".northeast"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "SOUTHEAST"
|
||||
command = ".southeast"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "NORTHWEST"
|
||||
command = "unequip-module"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+WEST"
|
||||
command = "westface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "WEST+REP"
|
||||
command = ".west"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+NORTH"
|
||||
command = "northface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "NORTH+REP"
|
||||
command = ".north"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+EAST"
|
||||
command = "eastface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "EAST+REP"
|
||||
command = ".east"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+SOUTH"
|
||||
command = "southface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "SOUTH+REP"
|
||||
command = ".south"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "INSERT"
|
||||
command = "a-intent right"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "DELETE"
|
||||
command = "delete-key-pressed"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "1"
|
||||
command = "toggle-module 1"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+1"
|
||||
command = "toggle-module 1"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "2"
|
||||
command = "toggle-module 2"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+2"
|
||||
command = "toggle-module 2"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "3"
|
||||
command = "toggle-module 3"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+3"
|
||||
command = "toggle-module 3"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "4"
|
||||
command = "a-intent left"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+4"
|
||||
command = "a-intent left"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "A+REP"
|
||||
command = ".west"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+A+REP"
|
||||
command = ".west"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "D+REP"
|
||||
command = ".east"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+D+REP"
|
||||
command = ".east"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F"
|
||||
command = "a-intent left"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+F"
|
||||
command = "a-intent left"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "G"
|
||||
command = "a-intent right"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+G"
|
||||
command = "a-intent right"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "Q"
|
||||
command = "unequip-module"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+Q"
|
||||
command = "unequip-module"
|
||||
is-disabled = false
|
||||
elem "s_key"
|
||||
name = "S+REP"
|
||||
command = ".south"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+S+REP"
|
||||
command = ".south"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "T"
|
||||
command = "say"
|
||||
is-disabled = false
|
||||
elem "w_key"
|
||||
name = "W+REP"
|
||||
command = ".north"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+W+REP"
|
||||
command = ".north"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "X"
|
||||
command = ".northeast"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+X"
|
||||
command = ".northeast"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "Y"
|
||||
command = "Activate-Held-Object"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+Y"
|
||||
command = "Activate-Held-Object"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "Z"
|
||||
command = "Activate-Held-Object"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+Z"
|
||||
command = "Activate-Held-Object"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F1"
|
||||
command = "adminhelp"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+SHIFT+F1+REP"
|
||||
command = ".options"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F2+REP"
|
||||
command = ".screenshot auto"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "SHIFT+F2+REP"
|
||||
command = ".screenshot"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F5"
|
||||
command = "Aghost"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F6"
|
||||
command = "Player-Panel-New"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F7"
|
||||
command = "Admin-PM"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F8"
|
||||
command = "Invisimin"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F12"
|
||||
command = "F12"
|
||||
is-disabled = false
|
||||
|
||||
macro "macro"
|
||||
elem
|
||||
name = "TAB"
|
||||
@@ -398,6 +612,160 @@ macro "hotkeymode"
|
||||
command = "F12"
|
||||
is-disabled = false
|
||||
|
||||
macro "borgmacro"
|
||||
elem
|
||||
name = "TAB"
|
||||
command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\""
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CENTER+REP"
|
||||
command = ".center"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "NORTHEAST"
|
||||
command = ".northeast"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "SOUTHEAST"
|
||||
command = ".southeast"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "NORTHWEST"
|
||||
command = "unequip-module"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+WEST"
|
||||
command = "westface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "WEST+REP"
|
||||
command = ".west"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+NORTH"
|
||||
command = "northface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "NORTH+REP"
|
||||
command = ".north"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+EAST"
|
||||
command = "eastface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "EAST+REP"
|
||||
command = ".east"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+SOUTH"
|
||||
command = "southface"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "SOUTH+REP"
|
||||
command = ".south"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "INSERT"
|
||||
command = "a-intent right"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "DELETE"
|
||||
command = "delete-key-pressed"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+1"
|
||||
command = "toggle-module 1"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+2"
|
||||
command = "toggle-module 2"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+3"
|
||||
command = "toggle-module 3"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+4"
|
||||
command = "a-intent left"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+A+REP"
|
||||
command = ".west"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+D+REP"
|
||||
command = ".east"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+F"
|
||||
command = "a-intent left"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+G"
|
||||
command = "a-intent right"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+Q"
|
||||
command = "unequip-module"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+S+REP"
|
||||
command = ".south"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+W+REP"
|
||||
command = ".north"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+X"
|
||||
command = ".northeast"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+Y"
|
||||
command = "Activate-Held-Object"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+Z"
|
||||
command = "Activate-Held-Object"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F1"
|
||||
command = "adminhelp"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "CTRL+SHIFT+F1+REP"
|
||||
command = ".options"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F2+REP"
|
||||
command = ".screenshot auto"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "SHIFT+F2+REP"
|
||||
command = ".screenshot"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F5"
|
||||
command = "Aghost"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F6"
|
||||
command = "Player-Panel-New"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F7"
|
||||
command = "Admin-PM"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F8"
|
||||
command = "Invisimin"
|
||||
is-disabled = false
|
||||
elem
|
||||
name = "F12"
|
||||
command = "F12"
|
||||
is-disabled = false
|
||||
|
||||
|
||||
menu "menu"
|
||||
elem
|
||||
|
||||
Reference in New Issue
Block a user