Merge branch 'master' of git://github.com/tgstation/-tg-station.git

This commit is contained in:
Firecage
2014-04-01 12:09:26 +02:00
24 changed files with 1808 additions and 1066 deletions
+1
View File
@@ -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
+25
View File
@@ -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
View File
@@ -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
+50
View File
@@ -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
View File
@@ -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")
+20 -6
View File
@@ -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)
+34 -26
View File
@@ -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>"
+160 -86
View File
@@ -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()
+111 -84
View File
@@ -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()
+2 -2
View File
@@ -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
+8 -3
View File
@@ -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()
+9 -6
View File
@@ -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
+50 -24
View File
@@ -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
+2
View File
@@ -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
View File
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)
+47 -4
View File
@@ -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
View File
@@ -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
+368
View File
@@ -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