diff --git a/baystation12.dme b/baystation12.dme
index b029869cf22..90daa241aea 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -439,9 +439,11 @@
#include "code\game\gamemodes\sandbox\h_sandbox.dm"
#include "code\game\gamemodes\sandbox\sandbox.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
+#include "code\game\gamemodes\wizard\rightandwrong.dm"
#include "code\game\gamemodes\wizard\soulstone.dm"
#include "code\game\gamemodes\wizard\spellbook.dm"
#include "code\game\gamemodes\wizard\spells.dm"
+#include "code\game\gamemodes\wizard\veilrender.dm"
#include "code\game\gamemodes\wizard\wizard.dm"
#include "code\game\jobs\access.dm"
#include "code\game\jobs\job_controller.dm"
@@ -1018,6 +1020,7 @@
#include "code\modules\power\sd_DynamicAreaLighting.dm"
#include "code\modules\power\smes.dm"
#include "code\modules\power\solar.dm"
+#include "code\modules\power\switch.dm"
#include "code\modules\power\terminal.dm"
#include "code\modules\power\tracker.dm"
#include "code\modules\power\turbine.dm"
diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm
index 8ae893b26b0..10e2f92a234 100644
--- a/code/datums/helper_datums/events.dm
+++ b/code/datums/helper_datums/events.dm
@@ -10,13 +10,16 @@
..()
events = new
- proc/addEventType(event_type)
+ proc/addEventType(event_type as text)
if(!(event_type in events) || !islist(events[event_type]))
events[event_type] = list()
return 1
return
- proc/addEvent(event_type,proc_holder,proc_name)
+
+ // Arguments: event_type as text, proc_holder as datum, proc_name as text
+ // Returns: New event, null on error.
+ proc/addEvent(event_type as text, proc_holder, proc_name as text)
if(!event_type || !proc_holder || !proc_name)
return
addEventType(event_type)
@@ -25,6 +28,8 @@
event += E
return E
+ // Arguments: event_type as text, any number of additional arguments to pass to event handler
+ // Returns: null
proc/fireEvent()
//world << "Events in [args[1]] called"
var/list/event = listgetindex(events,args[1])
@@ -35,7 +40,9 @@
clearEvent(args[1],E)
return
- proc/clearEvent(event_type,datum/event/E)
+ // Arguments: event_type as text, E as /datum/event
+ // Returns: 1 if event cleared, null on error
+ proc/clearEvent(event_type as text, datum/event/E)
if(!event_type || !E)
return
var/list/event = listgetindex(events,event_type)
diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index 66821e3d33b..311be1b3ba9 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -3,7 +3,7 @@
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
school = "evocation"
- charge_max = 100
+ charge_max = 150
clothes_req = 1
invocation = "FORTI GY AMA"
invocation_type = "shout"
@@ -134,6 +134,7 @@
summon_type = list("/obj/effect/forcefield")
summon_lifespan = 300
+
/obj/effect/proc_holder/spell/aoe_turf/conjure/carp
name = "Summon Bigger Carp"
desc = "This spell conjures an elite carp."
@@ -147,6 +148,21 @@
summon_type = list("/obj/effect/critter/spesscarp/elite")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/construct
+ name = "Artificer"
+ desc = "This spell conjures a construct which may be controlled by Shades"
+
+ school = "conjuration"
+ charge_max = 600
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+
+ summon_type = list("/obj/structure/constructshell")
+
+
/obj/effect/proc_holder/spell/aoe_turf/conjure/creature
name = "Summon Creature Swarm"
desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth"
@@ -211,4 +227,95 @@
ex_severe = -1
ex_heavy = -1
ex_light = 2
- ex_flash = 5
\ No newline at end of file
+ ex_flash = 5
+
+
+
+
+
+
+//////////////////////////////Construct Spells/////////////////////////
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser
+ charge_max = 1800
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/floor
+ name = "Floor Construction"
+ desc = "This spell constructs a cult floor"
+
+ school = "conjuration"
+ charge_max = 20
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+ summon_type = list("/turf/simulated/floor/engine/cult")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
+ name = "Leser Construction"
+ desc = "This spell constructs a cult wall"
+
+ school = "conjuration"
+ charge_max = 100
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+ summon_type = list("/turf/simulated/wall/cult")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
+ name = "Greater Construction"
+ desc = "This spell constructs a reinforced metal wall"
+
+ school = "conjuration"
+ charge_max = 300
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+
+ summon_type = list("/turf/simulated/wall/r_wall")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone
+ name = "Summon Soulstone"
+ desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space"
+
+ school = "conjuration"
+ charge_max = 3000
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+
+ summon_type = list("/obj/item/device/soulstone")
+
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall
+ name = "Shield"
+ desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire"
+
+ school = "transmutation"
+ charge_max = 300
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+ summon_type = list("/obj/effect/forcefield")
+ summon_lifespan = 50
+
+
+
+
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift
+ name = "Phase Shift"
+ desc = "This spell allows you to pass through walls"
+
+ school = "transmutation"
+ charge_max = 200
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = -1
+ include_user = 1
+
+ jaunt_duration = 50 //in deciseconds
diff --git a/code/defines/mob/living/carbon/alien_humanoid.dm b/code/defines/mob/living/carbon/alien_humanoid.dm
index 6a880121b4d..4c6ae07fbe3 100644
--- a/code/defines/mob/living/carbon/alien_humanoid.dm
+++ b/code/defines/mob/living/carbon/alien_humanoid.dm
@@ -45,7 +45,7 @@
health = 250
icon_state = "queen_s"
-
+ nopush = 1
/mob/living/carbon/alien/humanoid/rpbody
update_icon = 0
diff --git a/code/defines/obj/closet.dm b/code/defines/obj/closet.dm
index 652a89cac76..6a6bbd7ccca 100644
--- a/code/defines/obj/closet.dm
+++ b/code/defines/obj/closet.dm
@@ -464,6 +464,14 @@
/obj/structure/closet/secure_closet/personal/patient
name = "Patient's closet"
+/obj/structure/closet/secure_closet/personal/cabinet
+ icon_state = "cabinetdetective_locked"
+ icon_closed = "cabinetdetective"
+ icon_locked = "cabinetdetective_locked"
+ icon_opened = "cabinetdetective_open"
+ icon_broken = "cabinetdetective_broken"
+ icon_off = "cabinetdetective_broken"
+
/obj/structure/closet/secure_closet/kitchen
name = "Kitchen Cabinet"
req_access = list(access_kitchen)
diff --git a/code/defines/obj/toy.dm b/code/defines/obj/toy.dm
index 9011ac00c0d..00ac66c93cc 100644
--- a/code/defines/obj/toy.dm
+++ b/code/defines/obj/toy.dm
@@ -387,4 +387,64 @@
set src in usr
usr << text("\icon[] [] units of water left!", src, src.reagents.total_volume)
..()
- return
\ No newline at end of file
+ return
+
+/obj/item/toy/balloon
+ name = "water balloon"
+ desc = "A translucent balloon. There's nothing in it."
+ icon = 'toy.dmi'
+ icon_state = "waterballoon-e"
+ item_state = "balloon-empty"
+
+/obj/item/toy/balloon/New()
+ var/datum/reagents/R = new/datum/reagents(10)
+ reagents = R
+ R.my_atom = src
+
+/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ return
+
+/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob)
+ if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1)
+ A.reagents.trans_to(src, 10)
+ user << "\blue You fill the balloon with the contents of [A]."
+ src.desc = "A translucent balloon with some form of liquid sloshing around in it."
+ src.update_icon()
+ return
+
+/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/weapon/reagent_containers/glass))
+ if(O.reagents)
+ if(O.reagents.total_volume < 1)
+ user << "The [O] is empty."
+ else if(O.reagents.total_volume >= 1)
+ if(O.reagents.has_reagent("pacid", 1))
+ user << "The acid chews through the balloon!"
+ O.reagents.reaction(user)
+ del(src)
+ else
+ src.desc = "A translucent balloon with some form of liquid sloshing around in it."
+ user << "\blue You fill the balloon with the contents of [O]."
+ O.reagents.trans_to(src, 10)
+ src.update_icon()
+ return
+
+/obj/item/toy/balloon/throw_impact(atom/hit_atom)
+ if(src.reagents.total_volume >= 1)
+ src.visible_message("\red The [src] bursts!","You hear a pop and a splash.")
+ src.reagents.reaction(get_turf(hit_atom))
+ for(var/atom/A in get_turf(hit_atom))
+ src.reagents.reaction(A)
+ src.icon_state = "burst"
+ spawn(5)
+ if(src)
+ del(src)
+ return
+
+/obj/item/toy/balloon/update_icon()
+ if(src.reagents.total_volume >= 1)
+ icon_state = "waterballoon"
+ item_state = "balloon"
+ else
+ icon_state = "waterballoon-e"
+ item_state = "balloon-empty"
\ No newline at end of file
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 85c70ce50ab..d04d7105ddb 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -35,12 +35,52 @@
icon_state = "nullrod"
item_state = "nullrod"
flags = FPRINT | ONBELT | TABLEPASS
- force = 15
+ force = 10
throw_speed = 1
throw_range = 4
throwforce = 10
w_class = 1
+/obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob)
+
+ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+
+ log_admin("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src].")
+ message_admins("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src].")
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
+ if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ user << "\red You don't have the dexterity to do this!"
+ return
+
+ if ((user.mutations & CLUMSY) && prob(50))
+ user << "\red The rod slips out of your hand and hits your head."
+ user.take_organ_damage(10)
+ user.Paralyse(20)
+ return
+
+ if (M.stat !=2)
+ if((M.mind in ticker.mode.cult) && prob(33))
+ M << "\red The power of [src] clears your mind of the cult's influence!"
+ user << "\red You wave [src] over [M]'s head and see their eyes become clear, their mind returning to normal."
+ ticker.mode.remove_cultist(M.mind)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1)
+ else if(prob(10))
+ user << "\red The rod slips in your hand."
+ ..()
+ else
+ user << "\red The rod appears to do nothing."
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1)
+ return
+
+/obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob)
+ if (istype(A, /turf/simulated/floor))
+ user << "\blue You hit the floor with the [src]."
+ call(/obj/effect/rune/proc/revealrunes)(src)
+
/*/obj/item/weapon/sord
name = "\improper SORD"
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index b4ba4f2b18e..4cd97f79cc9 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -336,6 +336,7 @@
T.icon = I
else
T.icon = initial(icon)
+
if(blood_DNA && !blood_DNA.len)
del(blood_DNA)
if(src.fingerprints && src.fingerprints.len)
@@ -376,16 +377,10 @@
//world << "atom.Click() on [src] by [usr] : src.type is [src.type]"
if(!istype(src,/obj/item/weapon/gun))
usr.last_target_click = world.time
- var/list/pram = params2list(params)
- if((pram["alt"] != null && pram["ctrl"] != null && pram["left"] != null) && istype(src,/atom/movable))
- src:pull()
- return
- if(pram["ctrl"] != null && pram["left"] != null)
- src.examine()
- return
if(usr.client.buildmode)
build_click(usr, usr.client.buildmode, location, control, params, src)
return
+
if(using_new_click_proc) //TODO ERRORAGE (see message below)
return DblClickNew()
return DblClick(location, control, params)
@@ -694,6 +689,33 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// world << "atom.DblClick() on [src] by [usr] : src.type is [src.type]"
usr:lastDblClick = world.time
+ // ------- DIR CHANGING WHEN CLICKING (changes facting direction) ------
+
+ if( usr && iscarbon(usr) && !usr.buckled )
+ if( src.x && src.y && usr.x && usr.y )
+ var/dx = src.x - usr.x
+ var/dy = src.y - usr.y
+
+ if( dy > 0 && abs(dx) < dy ) //North
+ usr.dir = 1
+ if( dy < 0 && abs(dx) < abs(dy) ) //South
+ usr.dir = 2
+ if( dx > 0 && abs(dy) <= dx ) //East
+ usr.dir = 4
+ if( dx < 0 && abs(dy) <= abs(dx) ) //West
+ usr.dir = 8
+ if( dx == 0 && dy == 0 )
+ if(src.pixel_y > 16)
+ usr.dir = 1
+ if(src.pixel_y < -16)
+ usr.dir = 2
+ if(src.pixel_x > 16)
+ usr.dir = 4
+ if(src.pixel_x < -16)
+ usr.dir = 8
+
+
+
// ------- AI -------
if (istype(usr, /mob/living/silicon/ai))
@@ -707,6 +729,43 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
if (bot.lockcharge) return
..()
+
+
+
+
+
+ // ------- SHIFT-CLICK -------
+
+ var/parameters = params2list(params)
+
+ if(parameters["shift"]){
+ if(!isAI(usr))
+ ShiftClick(usr)
+ else
+ AIShiftClick(usr)
+ return
+ }
+
+ // ------- ALT-CLICK -------
+
+ if(parameters["alt"]){
+ if(!isAI(usr))
+ AltClick(usr)
+ else
+ AIAltClick(usr)
+ return
+ }
+
+ // ------- CTRL-CLICK -------
+
+ if(parameters["ctrl"]){
+ if(!isAI(usr))
+ CtrlClick(usr)
+ else
+ AICtrlClick(usr)
+ return
+ }
+
// ------- THROW -------
if(usr.in_throw_mode)
return usr:throw_item(src)
@@ -965,6 +1024,51 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
del D
return 1
+/atom/proc/CtrlClick(var/mob/M as mob)
+ examine()
+ return
+
+/atom/proc/AltClick()
+ if(hascall(src,"pull"))
+ src:pull()
+ return
+
+/atom/proc/ShiftClick()
+ if(hascall(src,"pull"))
+ src:pull()
+ return
+
+/atom/proc/AIShiftClick() // Opens and closes doors!
+ if(istype(src , /obj/machinery/door/airlock))
+ if(src:density)
+ var/nhref = "src=\ref[src];aiEnable=7"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ else
+ var/nhref = "src=\ref[src];aiDisable=7"
+ src.Topic(nhref, params2list(nhref), src, 1)
+
+ return
+
+/atom/proc/AIAltClick() // Eletrifies doors.
+ if(istype(src , /obj/machinery/door/airlock))
+ if(!src:secondsElectrified)
+ var/nhref = "src=\ref[src];aiEnable=6"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ else
+ var/nhref = "src=\ref[src];aiDisable=5"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ return
+
+/atom/proc/AICtrlClick() // Bolts doors.
+ if(istype(src , /obj/machinery/door/airlock))
+ if(src:locked)
+ var/nhref = "src=\ref[src];aiEnable=4"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ else
+ var/nhref = "src=\ref[src];aiDisable=4"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ return
+
/*/atom/proc/get_global_map_pos()
if(!islist(global_map) || isemptylist(global_map)) return
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
new file mode 100644
index 00000000000..5bd77a7fdeb
--- /dev/null
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -0,0 +1,54 @@
+
+
+/client/proc/rightandwrong()
+ set category = "Spells"
+ set desc = "Summon Guns"
+ set name = "Wizards: No sense of right and wrong!"
+
+ for(var/mob/living/carbon/human/H in world)
+ if(H.stat == 2 || !(H.client)) continue
+ if(is_special_character(H)) continue
+ if(prob(25))
+ ticker.mode.traitors += H.mind
+ H.mind.special_role = "traitor"
+ var/datum/objective/survive/survive = new
+ survive.owner = H.mind
+ H.mind.objectives += survive
+ H << "You are the survivor! Your own safety matters above all else, trust no one and kill anyone who gets in your way. However, armed as you are, now would be the perfect time to settle that score or grab that pair of yellow gloves you've been eyeing..."
+ var/obj_count = 1
+ for(var/datum/objective/OBJ in H.mind.objectives)
+ H << "Objective #[obj_count]: [OBJ.explanation_text]"
+ obj_count++
+ var/randomize = pick("taser","egun","laser","revolver","smg","decloner","deagle","gyrojet","pulse","silenced","cannon","shotgun","freeze","uzi","crossbow")
+ switch (randomize)
+ if("taser")
+ new /obj/item/weapon/gun/energy/taser(get_turf(H))
+ if("egun")
+ new /obj/item/weapon/gun/energy(get_turf(H))
+ if("laser")
+ new /obj/item/weapon/gun/energy/laser(get_turf(H))
+ if("revolver")
+ new /obj/item/weapon/gun/projectile(get_turf(H))
+ if("smg")
+ new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
+ if("decloner")
+ new /obj/item/weapon/gun/energy/decloner(get_turf(H))
+ if("deagle")
+ new /obj/item/weapon/gun/projectile/deagle/camo(get_turf(H))
+ if("gyrojet")
+ new /obj/item/weapon/gun/projectile/gyropistol(get_turf(H))
+ if("pulse")
+ new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H))
+ if("silenced")
+ new /obj/item/weapon/gun/projectile/silenced(get_turf(H))
+ if("cannon")
+ new /obj/item/weapon/gun/energy/lasercannon(get_turf(H))
+ if("shotgun")
+ new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H))
+ if("freeze")
+ new /obj/item/weapon/gun/energy/temperature(get_turf(H))
+ if("uzi")
+ new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
+ if("crossbow")
+ new /obj/item/weapon/gun/energy/crossbow(get_turf(H))
+ usr.verbs -= /client/proc/rightandwrong
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 54c48e838bd..eb313f56493 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -78,7 +78,17 @@
src.icon_state = "soulstone"
attack_self(U)
+///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
+/obj/structure/constructshell
+ name = "empty shell"
+ icon = 'wizard.dmi'
+ icon_state = "construct"
+ desc = "A wicked machine used by those skilled in magical arts. It is inactive"
+ flags = FPRINT | TABLEPASS
+/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/device/soulstone))
+ O.transfer_soul("CONSTRUCT",src,user)
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
@@ -123,7 +133,7 @@
C.name = "Soul Stone: [S.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 Capture successful!: \black [T.name]'s soul has been ripped from their body and stored within the soul stone."
- S << "The soulstone has been imprinted with [S.name]'s mind, it will no longer react to other souls."
+ U << "The soulstone has been imprinted with [S.name]'s mind, it will no longer react to other souls."
C.imprinted = "[S.name]"
del T
if("SHADE")
@@ -145,4 +155,50 @@
C.icon_state = "soulstone2"
T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone."
- return
\ No newline at end of file
+ if("CONSTRUCT")
+ var/obj/structure/constructshell/T = target
+ var/obj/item/device/soulstone/C = src
+ var/mob/living/simple_animal/shade/A = locate() in C
+ if(A)
+ var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
+ var/mob/living/simple_animal/Z
+ switch(construct_class)
+ if("Juggernaut")
+ Z = new /mob/living/simple_animal/constructarmoured (get_turf(T.loc))
+ if (A.client)
+ A.client.mob = Z
+ del(T)
+ Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall(Z)
+ Z.cancel_camera()
+ del(C)
+
+ if("Wraith")
+ Z = new /mob/living/simple_animal/constructwraith (get_turf(T.loc))
+ if (A.client)
+ A.client.mob = Z
+ del(T)
+ Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift(Z)
+ Z.cancel_camera()
+ del(C)
+
+ if("Artificer")
+ Z = new /mob/living/simple_animal/constructbuilder (get_turf(T.loc))
+ if (A.client)
+ A.client.mob = Z
+ del(T)
+ Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/wall(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/floor(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone(Z)
+ Z.cancel_camera()
+ del(C)
+ else
+ U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!"
+ return
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 6676196cece..dd3179789a0 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -25,16 +25,21 @@
dat += "Mutate (60) "
dat += "Ethereal Jaunt (60) "
dat += "Knock (10) "
+// if(op)
+// dat += "Summon Guns (One time use, global spell) "
dat += "
"
dat += "Artefacts: "
dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells. "
dat += "It is recommended that only experienced wizards attempt to wield such artefacts. "
dat += ""
- dat += "Staff of Change "
+ dat += "Staff of Change "
dat += ""
- dat += "Six Soul Stone Shards "
+ dat += "Six Soul Stone Shards and the spell Artificer "
dat += ""
- dat += "Re-memorize Spells "
+// if(op)
+// dat += "Veil Render "
+ dat += ""
+ dat += "Re-memorize Spells "
user << browse(dat, "window=radio")
onclose(user, "radio")
return
@@ -50,7 +55,7 @@
if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf))))
usr.machine = src
if(href_list["spell_choice"])
- if(src.uses >= 1 && href_list["spell_choice"] != 16)
+ if(src.uses >= 1 && src.max_uses >=1 && text2num(href_list["spell_choice"]) < 18)
src.uses--
if(spell_type == "verb")
switch(href_list["spell_choice"])
@@ -105,16 +110,24 @@
usr.verbs += /client/proc/knock
usr.mind.special_verbs += /client/proc/knock
src.temp = "This spell opens nearby doors and does not require wizard garb."
- if ("14")
+// if ("14")
+// usr.verbs += /client/proc/rightandwrong
+// src.max_uses--
+// src.temp = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill eachother. Just be careful not to get hit in the crossfire!"
+ if ("15")
new /obj/item/weapon/gun/energy/staff(get_turf(usr))
src.temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
src.max_uses--
- if ("15")
+ if ("16")
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(usr))
src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying"
src.max_uses--
+// if ("17")
+// new /obj/item/weapon/veilrender(get_turf(usr))
+// src.temp = "Recovered from a shattered temple in what was speculated to be the ruins of an alien capital city, the blade is said to cut more than just the material. There was no trace of the blades creators, nor of any other life left on the dead planet, and what caused such an apocalypse remains a mystery."
+// src.max_uses--
else if(spell_type == "object")
- var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock")
+ var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock","Summon Guns","Staff of Change","Six Soul Stone Shards and the spell Artificer","Veil Render")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in usr.spell_list)
if(available_spells[text2num(href_list["spell_choice"])] == aspell.name)
@@ -125,67 +138,79 @@
if(!already_knows)
switch(href_list["spell_choice"])
if ("1")
- feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(usr)
src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage."
if ("2")
- feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/fireball(usr)
src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you."
// if ("3")
+// feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
// usr.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(usr)
// src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
if ("4")
- feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(usr)
src.temp = "This spell disables all weapons, cameras and most other technology in range."
if ("5")
- feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/smoke(usr)
src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
if ("6")
- feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/trigger/blind(usr)
src.temp = "This spell temporarly blinds a single person and does not require wizard garb."
if ("7")
- feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(usr)
src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process."
if ("8")
- feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(usr)
src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
if ("9")
- feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(usr)
src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience."
if ("10")
- feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(usr)
src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable."
if ("11")
- feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/genetic/mutate(usr)
src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while."
if ("12")
- feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(usr)
src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
if ("13")
- feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(usr)
src.temp = "This spell opens nearby doors and does not require wizard garb."
- if ("14")
- feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+// if ("14")
+// //feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+// usr.verbs += /client/proc/rightandwrong
+// src.max_uses--
+// src.temp = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill eachother. Just be careful not to get hit in the crossfire!"
+ if ("15")
+ //feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/energy/staff(get_turf(usr))
src.temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
src.max_uses--
- if ("15")
- feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ if ("16")
+ //feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(usr))
- src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying"
+ usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(usr)
+ src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot."
src.max_uses--
- if (href_list["spell_choice"] == "16")
+// if ("17")
+// //feedback_add_details("wizard_spell_learned","VR") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+// new /obj/item/weapon/veilrender(get_turf(usr))
+// src.temp = "Recovered from a shattered temple in what was speculated to be the ruins of an alien capital city, the blade is said to cut more than just the material. There was no trace of the blades creators, nor of any other life left on the dead planet, and what caused such an apocalypse remains a mystery.(Activate inhand to trigger its special ability)"
+// src.max_uses--
+ if (href_list["spell_choice"] == "18")
var/area/wizard_station/A = locate()
if(usr in A.contents)
src.uses = src.max_uses
diff --git a/code/game/gamemodes/wizard/veilrender.dm b/code/game/gamemodes/wizard/veilrender.dm
new file mode 100644
index 00000000000..2310b16ff41
--- /dev/null
+++ b/code/game/gamemodes/wizard/veilrender.dm
@@ -0,0 +1,41 @@
+/obj/item/weapon/veilrender
+ name = "veil render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
+ icon = 'wizard.dmi'
+ icon_state = "render"
+ item_state = "render"
+ flags = FPRINT | TABLEPASS
+ force = 15
+ throwforce = 10
+ w_class = 3
+ var/charged = 1
+
+
+/obj/effect/rend
+ name = "Tear in the fabric of reality"
+ desc = "You should run now"
+ icon = 'biomass.dmi'
+ icon_state = "rift"
+ density = 1
+ unacidable = 1
+ anchored = 1.0
+
+
+/obj/effect/rend/New()
+ spawn(50)
+ new /obj/machinery/singularity/narsie/wizard(get_turf(src))
+ del(src)
+ return
+ return
+
+
+/obj/item/weapon/veilrender/attack_self(mob/user as mob)
+ if(charged == 1)
+ new /obj/effect/rend(get_turf(usr))
+ charged = 0
+ for(var/mob/M in viewers(usr, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red [src] hums with power as [usr] deals a blow to reality itself!")
+ else
+ user << "\red The unearthly energies that powered the blade are now dormant"
+
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index a5a9950441e..afb73392adf 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -69,12 +69,11 @@ obj/machinery/door/airlock
. = ..()
if(!surpress_send) send_status()
- proc
- set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- if(new_frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
+ proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ if(new_frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
initialize()
if(frequency)
@@ -140,11 +139,10 @@ obj/machinery/airlock_sensor
update_icon()
- proc
- set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
+ proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
initialize()
set_frequency(frequency)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 4279110d627..22cb14661fe 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -58,10 +58,10 @@
else
icon_state = "[color]"
if(holding)
- overlays += image('atmos.dmi', "can-open")
+ overlays += "can-open"
if(connected_port)
- overlays += image('atmos.dmi', "can-connector")
+ overlays += "can-connector"
var/tank_pressure = air_contents.return_pressure()
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 4c83f8a76fb..f718d8ba034 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -19,6 +19,12 @@
else
icon_state = "psiphon:0"
+ if(holding)
+ overlays += "siphon-open"
+
+ if(connected_port)
+ overlays += "siphon-connector"
+
return
/obj/machinery/portable_atmospherics/pump/process()
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index cec39215e6b..c3ea2164a1d 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -39,6 +39,12 @@
else
icon_state = "pscrubber:0"
+ if(holding)
+ overlays += "scrubber-open"
+
+ if(connected_port)
+ overlays += "scrubber-connector"
+
return
/obj/machinery/portable_atmospherics/scrubber/process()
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index eabfdd003ab..17239407b6e 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -51,7 +51,7 @@
if(!charging || (stat & (BROKEN|NOPOWER)) )
return
- var/added = charging.give(500)
+ var/added = charging.give(75)
use_power(added / CELLRATE)
updateicon()
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index c6c2eac9296..083c12c5378 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -146,6 +146,8 @@
new /obj/item/toy/crayonbox(src.loc)
if(9)
new /obj/item/toy/spinningtoy(src.loc)
+ // if(10) //Commented out on Urist-chan's orders~
+ // new /obj/item/toy/balloon(src.loc) //Until it gets a better sprite~
else
var/atom/movable/Prize = pick(contents)
Prize.loc = src.loc
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index b7a8cf2fdcf..2143fcf71e3 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1068,8 +1068,9 @@ About the new airlock wires panel:
-/obj/machinery/door/airlock/Topic(href, href_list)
- ..()
+/obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0)
+ if(!nowindow)
+ ..()
if (usr.stat || usr.restrained() )
return
if (href_list["close"])
@@ -1277,7 +1278,8 @@ About the new airlock wires panel:
src.holdopen = 1
src.update_icon()
- src.updateUsrDialog()
+ if(!nowindow)
+ src.updateUsrDialog()
if((istype(usr.equipped(), /obj/item/device/hacktool)))
return attack_ai(usr, usr.equipped())
else if(issilicon(usr))
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index cdb69cf7593..758a5347043 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -300,6 +300,7 @@
src.operating = 1
animate("opening")
+ src.sd_SetOpacity(0)
sleep(10)
src.layer = 2.7
src.density = 0
diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm
index 24e66288dcd..c8924d62c7d 100644
--- a/code/game/magic/cultist/ritual.dm
+++ b/code/game/magic/cultist/ritual.dm
@@ -126,9 +126,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
user << "You retrace your steps, carefully undoing the lines of the rune."
del(src)
return
- else if(istype(I, /obj/item/weapon/storage/bible) && usr.mind && (usr.mind.assigned_role == "Chaplain"))
- var/obj/item/weapon/storage/bible/bible = I
- user << "\blue You banish the vile magic with the blessing of [bible.deity_name]!"
+ else if(istype(I, /obj/item/weapon/nullrod))
+ user << "\blue You disrupt the vile magic with the deadening field of the null rod!"
del(src)
return
return
@@ -502,7 +501,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
if(prob(C*5-105-(runedec-ticker.mode.cult.len)*5)) //including the useless rune at the secret room, shouldn't count against the limit - Urist
usr.emote("scream")
user << "\red A tear momentarily appears in reality. Before it closes, you catch a glimpse of that which lies beyond. That proves to be too much for your mind."
- usr.gib(1)
+ usr.gib()
return
if("No")
return
diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm
index 6691b3b571d..14b7a63bd95 100644
--- a/code/game/magic/cultist/runes.dm
+++ b/code/game/magic/cultist/runes.dm
@@ -306,7 +306,7 @@ var/list/sacrificed = list()
body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \
"\red You feel as your blood boils, tearing you apart.", \
"\red You hear a thousand voices, all crying in pain.")
- body_to_sacrifice.gib(1)
+ body_to_sacrifice.gib()
if (ticker.mode.name == "cult")
ticker.mode:add_cultist(body_to_sacrifice.mind)
else
@@ -571,7 +571,7 @@ var/list/sacrificed = list()
if(H.mind == ticker.mode:sacrifice_target)
if(cultsinrange.len >= 3)
sacrificed += H.mind
- H.gib(1)
+ H.gib()
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
else
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
@@ -584,7 +584,7 @@ var/list/sacrificed = list()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, this soul was not enough to gain His favor."
- H.gib(1)
+ H.gib()
else
if(prob(40))
usr << "\red The Geometer of blood accepts this sacrifice."
@@ -592,7 +592,7 @@ var/list/sacrificed = list()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
- H.gib(1)
+ H.gib()
else
if(H.stat !=2)
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
@@ -603,17 +603,36 @@ var/list/sacrificed = list()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
- H.gib(1)
+ H.gib()
else
if(cultsinrange.len >= 3)
- H.gib(1)
- usr << "\red The Geometer of Blood accepts this sacrifice."
+ if(H.stat !=2)
+ if(prob(80))
+ usr << "\red The Geometer of Blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, this soul was not enough to gain His favor."
+ H.gib()
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ H.gib()
else
if(H.stat !=2)
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else
- H.gib(1)
- usr << "\red The Geometer of blood accepts this sacrifice."
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ H.gib()
for(var/mob/living/carbon/monkey/M in src.loc)
if (ticker.mode.name == "cult")
if(M.mind == ticker.mode:sacrifice_target)
@@ -632,11 +651,13 @@ var/list/sacrificed = list()
usr << "\red However, a mere monkey is not enough to satisfy Him."
else
usr << "\red The Geometer of Blood accepts your meager sacrifice."
- M.gib(1)
+ if(prob(20))
+ ticker.mode.grant_runeword(usr)
+ M.gib()
/* for(var/mob/living/carbon/alien/A)
for(var/mob/K in cultsinrange)
K.say("Barhah hra zar'garis!")
- A.dust() /// A.gib(1) doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need.
+ A.dust() /// A.gib() doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need.
if (ticker.mode.name == "cult")
if(prob(75))
usr << "\red The Geometer of Blood accepts your exotic sacrifice."
@@ -661,7 +682,7 @@ var/list/sacrificed = list()
if (istype(W,/obj/item/weapon/paper/talisman))
rad = 4
go = 1
- if (istype(W,/obj/item/weapon/storage/bible))
+ if (istype(W,/obj/item/weapon/nullrod))
rad = 1
go = 1
if(go)
@@ -670,7 +691,7 @@ var/list/sacrificed = list()
R:visibility=15
S=1
if(S)
- if(istype(W,/obj/item/weapon/storage/bible))
+ if(istype(W,/obj/item/weapon/nullrod))
usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!"
return
if(istype(W,/obj/effect/rune))
@@ -770,7 +791,7 @@ var/list/sacrificed = list()
if (cultist == user) //just to be sure.
return
if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
- user << "\red You cannot summon the [cultist], for him shackles of blood are strong"
+ user << "\red You cannot summon the [cultist], for his shackles of blood are strong"
return fizzle()
cultist.loc = src.loc
cultist.lying = 1
@@ -793,6 +814,9 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/C in range(7,src))
if (iscultist(C))
continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
C.ear_deaf += 50
C.show_message("\red The world around you suddenly becomes quiet.", 3)
affected++
@@ -809,6 +833,9 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/C in range(7,usr))
if (iscultist(C))
continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
C.ear_deaf += 30
//talismans is weaker.
C.show_message("\red The world around you suddenly becomes quiet.", 3)
@@ -827,6 +854,9 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/C in viewers(src))
if (iscultist(C))
continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
C.eye_blurry += 50
C.eye_blind += 20
if(prob(5))
@@ -846,6 +876,9 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/C in viewers(usr))
if (iscultist(C))
continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
C.eye_blurry += 30
C.eye_blind += 10
//talismans is weaker.
@@ -873,11 +906,14 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/M in viewers(usr))
if(iscultist(M))
continue
+ var/obj/item/weapon/nullrod/N = locate() in M
+ if(N)
+ continue
M.take_overall_damage(51,51)
M << "\red Your blood boils!"
if(prob(5))
spawn(5)
- M.gib(1)
+ M.gib()
for(var/obj/effect/rune/R in view(src))
if(prob(10))
explosion(R.loc, -1, 0, 1, 5)
@@ -933,14 +969,19 @@ var/list/sacrificed = list()
del(src)
else ///When invoked as talisman, stun and mute the target mob.
usr.say("Dream sign ''Evil sealing talisman''!")
- for(var/mob/O in viewers(T, null))
- O.show_message(text("\red [] invokes a talisman at []", usr, T), 1)
- flick("e_flash", T.flash)
- if (!(T.mutations & HULK))
- T.silent += 15
- T.Weaken(25)
- T.Stun(25)
- return
+ var/obj/item/weapon/nullrod/N = locate() in T
+ if(N)
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1)
+ else
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("\red [] invokes a talisman at []", usr, T), 1)
+ flick("e_flash", T.flash)
+ if (!(T.mutations & HULK))
+ T.silent += 15
+ T.Weaken(25)
+ T.Stun(25)
+ return
/////////////////////////////////////////TWENTY-FIFTH RUNE
diff --git a/code/game/magic/cultist/talisman.dm b/code/game/magic/cultist/talisman.dm
index 30abdbe3a56..5b4498c6bc7 100644
--- a/code/game/magic/cultist/talisman.dm
+++ b/code/game/magic/cultist/talisman.dm
@@ -73,6 +73,7 @@
dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman. "
dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade "
dat += "Kal om neth - Summons a soul stone "
+ dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person. "
usr << browse(dat, "window=id_com;size=350x200")
return
@@ -107,6 +108,8 @@
T.imbue = "armor"
if("soulstone")
new /obj/item/device/soulstone(get_turf(usr))
+ if("construct")
+ new /obj/structure/constructshell(get_turf(usr))
src.uses--
supply()
return
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index cd4a8bba15c..7d8520791ce 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -272,7 +272,7 @@
spawn_result()
..()
- feedback_inc("mecha_ripley_created",1)
+ //feedback_inc("mecha_ripley_created",1)
return
@@ -515,7 +515,7 @@
spawn_result()
..()
- feedback_inc("mecha_gygax_created",1)
+ //feedback_inc("mecha_gygax_created",1)
return
/datum/construction/mecha/firefighter_chassis
@@ -708,7 +708,7 @@
spawn_result()
..()
- feedback_inc("mecha_firefighter_created",1)
+ //feedback_inc("mecha_firefighter_created",1)
return
@@ -787,7 +787,7 @@
spawn_result()
..()
- feedback_inc("mecha_honker_created",1)
+ //feedback_inc("mecha_honker_created",1)
return
/datum/construction/mecha/durand_chassis
@@ -900,7 +900,7 @@
spawn_result()
..()
- feedback_inc("mecha_durand_created",1)
+ //feedback_inc("mecha_durand_created",1)
return
@@ -1104,5 +1104,5 @@
spawn_result()
..()
- feedback_inc("mecha_odysseus_created",1)
+ //feedback_inc("mecha_odysseus_created",1)
return
\ No newline at end of file
diff --git a/code/game/objects/closets/secure/engineering.dm b/code/game/objects/closets/secure/engineering.dm
index 55a6d9d6909..7e0f4f4595f 100644
--- a/code/game/objects/closets/secure/engineering.dm
+++ b/code/game/objects/closets/secure/engineering.dm
@@ -12,25 +12,25 @@
New()
..()
sleep(2)
- new /obj/item/wardrobe/chief_engineer(src)
- new /obj/item/blueprints(src)
var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src)
var/obj/item/weapon/storage/box/B = new(BPK)
+ new /obj/item/wardrobe/chief_engineer(src)
+ new /obj/item/blueprints(src)
+ new /obj/item/clothing/under/rank/chief_engineer(src)
new /obj/item/weapon/pen(B)
new /obj/item/device/pda/heads/ce(src)
- new /obj/item/device/multitool(src)
- new /obj/item/device/flash(src)
new /obj/item/clothing/head/helmet/hardhat/white(src)
new /obj/item/clothing/head/helmet/welding(src)
+ new /obj/item/clothing/gloves/yellow(src)
+ new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/storage/belt/utility/full(src)
+ new /obj/item/device/radio/headset/heads/ce(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/clothing/suit/hazardvest(src)
- new /obj/item/clothing/gloves/yellow(src)
new /obj/item/clothing/mask/gas(src)
+ new /obj/item/device/multitool(src)
+ new /obj/item/device/flash(src)
new /obj/item/clothing/glasses/meson(src)
- new /obj/item/device/radio/headset/heads/ce(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/under/rank/chief_engineer(src)
return
@@ -54,6 +54,9 @@
new /obj/item/weapon/storage/toolbox/electrical(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
+ new /obj/item/weapon/module/power_control(src)
+ new /obj/item/weapon/module/power_control(src)
+ new /obj/item/weapon/module/power_control(src)
new /obj/item/device/multitool(src)
new /obj/item/device/multitool(src)
new /obj/item/device/multitool(src)
@@ -83,6 +86,8 @@
new /obj/item/weapon/weldingtool/largetank(src)
return
+
+
/obj/structure/closet/secure_closet/engineering_personal
name = "Engineer's Locker"
req_access = list(access_engine)
@@ -93,6 +98,7 @@
icon_broken = "secureengbroken"
icon_off = "secureengoff"
+
New()
..()
sleep(2)
@@ -100,18 +106,18 @@
//
var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src)
var/obj/item/weapon/storage/box/B = new(BPK)
+ new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/shoes/orange(src)
new /obj/item/weapon/pen(B)
new /obj/item/device/pda/engineering(src)
new /obj/item/device/t_scanner(src)
- new /obj/item/clothing/suit/hazardvest(src)
new /obj/item/weapon/storage/belt/utility/full(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
+ new /obj/item/device/radio/headset/headset_eng(src)
+ new /obj/item/clothing/suit/hazardvest(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/head/helmet/hardhat(src)
new /obj/item/clothing/glasses/meson(src)
- new /obj/item/device/radio/headset/headset_eng(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/under/rank/engineer(src)
return
/obj/structure/closet/secure_closet/atmos_personal
diff --git a/code/game/objects/closets/secure/personal.dm b/code/game/objects/closets/secure/personal.dm
index 6fa801c0a50..2b0b8ad3b97 100644
--- a/code/game/objects/closets/secure/personal.dm
+++ b/code/game/objects/closets/secure/personal.dm
@@ -21,6 +21,15 @@
new /obj/item/clothing/shoes/white( src )
return
+
+/obj/structure/closet/secure_closet/personal/cabinet/New()
+ ..()
+ spawn(4)
+ contents = list()
+ new /obj/item/weapon/storage/backpack/satchel( src )
+ new /obj/item/device/radio/headset( src )
+ return
+
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.opened)
if (istype(W, /obj/item/weapon/grab))
@@ -66,4 +75,4 @@
O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
else
user << "\red Access Denied"
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index 7de5fd1ecc1..9645c344242 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -15,14 +15,14 @@
//
new /obj/item/device/pda/captain(src)
new /obj/item/weapon/storage/id_kit(src)
- new /obj/item/weapon/reagent_containers/food/drinks/flask(src)
- new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/clothing/suit/armor/captain(src)
+ new /obj/item/clothing/head/helmet/cap(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/head/helmet/swat(src)
new /obj/item/device/radio/headset/heads/captain(src)
- new /obj/item/clothing/suit/armor/captain(src)
- new /obj/item/clothing/head/helmet/cap(src)
+ new /obj/item/weapon/reagent_containers/food/drinks/flask(src)
+ new /obj/item/weapon/gun/energy/gun(src)
return
@@ -45,12 +45,12 @@
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
- new /obj/item/device/flash(B)
new /obj/item/device/pda/heads/hop(src)
+ new /obj/item/device/radio/headset/heads/hop(src)
new /obj/item/weapon/storage/id_kit(src)
new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/device/flash(src)
new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/device/radio/headset/heads/hop(src)
return
@@ -74,12 +74,12 @@
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
new /obj/item/device/flash(B)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/device/pda/heads/hos(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/weapon/storage/lockbox/loyalty(src)
new /obj/item/weapon/storage/flashbang_kit(src)
+ new /obj/item/weapon/storage/lockbox/loyalty(src)
+ new /obj/item/weapon/melee/baton(src)
+ new /obj/item/weapon/gun/energy/gun(src)
return
/obj/structure/closet/secure_closet/warden
@@ -102,15 +102,17 @@
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
new /obj/item/device/flash(B)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/device/pda/security(src)
new /obj/item/clothing/suit/armor/vest(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/weapon/storage/flashbang_kit(src)
+ new /obj/item/weapon/melee/baton(src)
+ new /obj/item/weapon/gun/energy/taser(src)
+ new /obj/item/clothing/glasses/sunglasses/sechud(src)
return
+
+
/obj/structure/closet/secure_closet/security
name = "Security Locker"
req_access = list(access_security)
@@ -130,18 +132,18 @@
var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src)
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
- new /obj/item/device/flash(B)
- new /obj/item/weapon/pepperspray(src)
- new /obj/item/weapon/melee/baton(src)
new /obj/item/policetaperoll(src)
- new /obj/item/weapon/flashbang(src)
- new /obj/item/device/pda/security(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/suit/storage/gearharness(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/weapon/storage/belt/security(src)
new /obj/item/clothing/head/helmet(src)
+ new /obj/item/device/pda/security(src)
new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/weapon/storage/belt/security(src)
+ new /obj/item/weapon/flashbang(src)
+ new /obj/item/weapon/pepperspray(src)
+ new /obj/item/device/flash(src)
+ new /obj/item/weapon/melee/baton(src)
+ new /obj/item/clothing/glasses/sunglasses/sechud(src)
return
@@ -156,7 +158,6 @@
icon_broken = "cabinetdetective_broken"
icon_off = "cabinetdetective_broken"
-
New()
..()
sleep(2)
diff --git a/code/game/objects/secstorage/secstorage.dm b/code/game/objects/secstorage/secstorage.dm
index 6e1b1d05f85..0193fcb3977 100644
--- a/code/game/objects/secstorage/secstorage.dm
+++ b/code/game/objects/secstorage/secstorage.dm
@@ -127,7 +127,7 @@
if ((istype(W, /obj/item/device/multitool)) && (src.open == 1) && (src.locked ==1) && (!src.l_hacking))
user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1)
src.l_hacking = 1
- spawn(100)
+ if (do_after(usr, 100))
if (prob(40))
src.l_setshort = 1
src.l_set = 0
@@ -138,6 +138,7 @@
else
user.show_message(text("\red Unable to reset internal memory."), 1)
src.l_hacking = 0
+ else src.l_hacking = 0
return
if (src.contents.len >= 7)
return
diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm
index 57c2e45314d..270d8d49951 100644
--- a/code/game/objects/storage/belt.dm
+++ b/code/game/objects/storage/belt.dm
@@ -77,6 +77,7 @@
new /obj/item/weapon/wirecutters(src)
new /obj/item/weapon/cable_coil(src,30,pick("red","yellow"))
+
/obj/item/weapon/storage/belt/utility/atmostech/New()
..()
new /obj/item/weapon/screwdriver(src)
diff --git a/code/game/objects/storage/bible.dm b/code/game/objects/storage/bible.dm
index 38a22b00774..63a6edb8bd7 100644
--- a/code/game/objects/storage/bible.dm
+++ b/code/game/objects/storage/bible.dm
@@ -16,6 +16,7 @@
new /obj/item/weapon/reagent_containers/pill/antitox/tajaran(src)
new /obj/item/clothing/suit/monk(src)
+/* // All cult functionality moved to Null Rod
/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -83,12 +84,12 @@
O.show_message(text("\red [] smacks []'s lifeless corpse with [].", user, M, src), 1)
playsound(src.loc, "punch", 25, 1, -1)
return
-
+*/
/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob)
- if (istype(A, /turf/simulated/floor))
- user << "\blue You hit the floor with the bible."
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
- call(/obj/effect/rune/proc/revealrunes)(src)
+// if (istype(A, /turf/simulated/floor))
+// user << "\blue You hit the floor with the bible."
+// if(user.mind && (user.mind.assigned_role == "Chaplain"))
+// call(/obj/effect/rune/proc/revealrunes)(src)
if(user.mind && (user.mind.assigned_role == "Chaplain"))
if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
user << "\blue You bless [A]."
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index 6c0fac86662..00116a25876 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -768,10 +768,10 @@ datum
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
- M:adjustToxLoss(0.2)
- M.take_organ_damage(0, 1)
+ M:adjustToxLoss(1)
..()
return
+
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return //wooo more runtime fixin
@@ -782,17 +782,21 @@ datum
M << "\red Your mask melts away!"
return
if(M:head)
- del (M:head)
- M << "\red Your helmet melts into uselessness!"
+ if(prob(15))
+ del(M:head)
+ M << "\red Your helmet melts from the acid!"
+ else
+ M << "\red Your helmet protects you from the acid!"
return
var/datum/organ/external/head/affecting = M:get_organ("head")
- affecting.disfigured = 1
- affecting.take_damage(35, 0)
+ affecting.take_damage(15, 0)
M:UpdateDamageIcon()
M:emote("scream")
- M << "\red Your face has become disfigured!"
- M.real_name = "Unknown"
- M.warn_flavor_changed()
+ if(prob(15))
+ M << "\red Your face has become disfigured!"
+ M.real_name = "Unknown"
+ M.warn_flavor_changed()
+ affecting.disfigured = 1
else
if(istype(M, /mob/living/carbon/monkey) && M:wear_mask)
del (M:wear_mask)
@@ -802,13 +806,14 @@ datum
else
if(istype(M, /mob/living/carbon/human))
var/datum/organ/external/head/affecting = M:get_organ("head")
- affecting.disfigured = 1
- affecting.take_damage(30, 0)
+ affecting.take_damage(15, 0)
M:UpdateDamageIcon()
M:emote("scream")
- M << "\red Your face has become disfigured!"
- M.real_name = "Unknown"
- M.warn_flavor_changed()
+ if(prob(15))
+ M << "\red Your face has become disfigured!"
+ M.real_name = "Unknown"
+ M.warn_flavor_changed()
+ affecting.disfigured = 1
else
M.take_organ_damage(min(15, volume * 4))
diff --git a/code/modules/clothing/gimmick.dm b/code/modules/clothing/gimmick.dm
index 756309a9bbb..821b94056e7 100644
--- a/code/modules/clothing/gimmick.dm
+++ b/code/modules/clothing/gimmick.dm
@@ -1,11 +1,11 @@
/obj/item/clothing/head/rabbitears
- name = "Rabbit Ears"
+ name = "rabbit ears"
desc = "Wearing these makes you looks useless, and only good for your sex appeal."
icon_state = "bunny"
flags = FPRINT | TABLEPASS
/obj/item/clothing/head/kitty
- name = "Kitty Ears"
+ name = "kitty ears"
desc = "A pair of kitty ears. Meow!"
icon_state = "kitty"
flags = FPRINT | TABLEPASS
@@ -37,12 +37,12 @@
color = "rainbow"
/obj/item/clothing/mask/owl_mask
- name = "Owl mask"
+ name = "owl mask"
desc = "Twoooo!"
icon_state = "owl"
/obj/item/clothing/under/owl
- name = "Owl uniform"
+ name = "owl uniform"
desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!"
icon_state = "owl"
color = "owl"
@@ -71,6 +71,7 @@
item_state = "death"
flags = FPRINT | TABLEPASS | CONDUCT
fire_resist = T0C+5200
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
/*/obj/item/clothing/under/nazi1
name = "Nazi uniform"
@@ -80,24 +81,29 @@
/obj/item/clothing/suit/greatcoat
name = "great coat"
- desc = "A Nazi great coat."
+ desc = "A Nazi great coat"
icon_state = "nazi"
item_state = "nazi"
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/johnny
- name = "Johnny~~"
+ name = "johnny~~ jumpsuit"
desc = "Johnny~~"
icon_state = "johnny"
color = "johnny"
/obj/item/clothing/suit/johnny_coat
- name = "Johnny~~"
+ name = "johnny~~ coat"
desc = "Johnny~~"
icon_state = "johnny"
item_state = "johnny"
flags = FPRINT | TABLEPASS
+/obj/item/clothing/suit/ianshirt
+ name = "worn shirt"
+ desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in."
+ icon_state = "ianshirt"
+ item_state = "ianshirt"
/obj/item/clothing/under/rainbow
name = "rainbow"
@@ -215,42 +221,42 @@
item_state = "headset" // lol
/obj/item/clothing/under/gimmick/rank/captain/suit
- name = "Captain's Suit"
+ name = "captain's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
icon_state = "green_suit"
item_state = "dg_suit"
color = "green_suit"
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit
- name = "Head of Personnel's Suit"
+ name = "head of personnel's suit"
desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble."
icon_state = "teal_suit"
item_state = "g_suit"
color = "teal_suit"
/obj/item/clothing/under/suit_jacket
- name = "Black Suit"
+ name = "black suit"
desc = "A black suit and red tie. Very formal."
icon_state = "black_suit"
item_state = "bl_suit"
color = "black_suit"
/obj/item/clothing/under/suit_jacket/really_black
- name = "Executive Suit"
+ name = "executive suit"
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
color = "black_suit"
/obj/item/clothing/under/suit_jacket/red
- name = "Red Suit"
+ name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
icon_state = "red_suit"
item_state = "r_suit"
color = "red_suit"
/obj/item/clothing/under/blackskirt
- name = "Black skirt"
+ name = "black skirt"
desc = "A black skirt, very fancy!"
icon_state = "blackskirt"
color = "blackskirt"
@@ -263,13 +269,13 @@
item_state = "schoolgirl"
color = "schoolgirl"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
-
+/*
/obj/item/clothing/under/gimmick/rank/police
- name = "Police Uniform"
+ name = "police uniform"
desc = "Move along, nothing to see here."
icon_state = "police"
item_state = "b_suit"
- color = "police"
+ color = "police" */ //No Sprite - Shiftyeyesshady
/obj/item/clothing/head/flatcap
name = "flat cap"
@@ -278,7 +284,7 @@
item_state = "detective"
/obj/item/clothing/under/overalls
- name = "Laborer's Overalls"
+ name = "laborer's overalls"
desc = "A set of durable overalls for getting the job done."
icon_state = "overalls"
item_state = "lb_suit"
@@ -294,7 +300,7 @@
force = 10
/obj/item/clothing/under/pirate
- name = "Pirate Outfit"
+ name = "pirate outfit"
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
@@ -326,6 +332,7 @@
icon_state = "hgpirate"
item_state = "hgpirate"
flags = FPRINT | TABLEPASS
+ flags_inv = HIDEJUMPSUIT
/obj/item/clothing/glasses/eyepatch
name = "eyepatch"
@@ -358,119 +365,120 @@
desc = "Perfect for winter in Siberia, da?"
icon_state = "ushankadown"
item_state = "ushankadown"
+ flags_inv = HIDEEARS
/obj/item/clothing/head/collectable //Hat Station 13
- name = "Collectable Hat"
+ name = "collectable hat"
desc = "A rare collectable hat."
/obj/item/clothing/head/collectable/petehat
- name = "Ultra Rare! Pete's Hat!"
+ name = "ultra rare Pete's hat!"
desc = "It smells faintly of plasma"
icon_state = "petehat"
/obj/item/clothing/head/collectable/metroid
- name = "Collectable Metroid Cap!"
+ name = "collectable metroid cap!"
desc = "It just latches right in place!"
icon_state = "metroid"
/obj/item/clothing/head/collectable/xenom
- name = "Collectable Xenomorph Helmet!"
+ name = "collectable xenomorph helmet!"
desc = "Hiss hiss hiss!"
icon_state = "xenom"
/obj/item/clothing/head/collectable/chef
- name = "Collectable Chef's Hat"
+ name = "collectable chef's hat"
desc = "A rare Chef's Hat meant for hat collectors!"
icon_state = "chef"
item_state = "chef"
/obj/item/clothing/head/collectable/paper
- name = "Collectable Paper Hat"
+ name = "collectable paper hat"
desc = "What looks like an ordinary paper hat, is actually a rare and valuable collector's edition paper hat. Keep away from water, fire and Librarians."
icon_state = "paper"
/obj/item/clothing/head/collectable/tophat
- name = "Collectable Top Hat"
+ name = "collectable top hat"
desc = "A top hat worn by only the most prestigious hat collectors."
icon_state = "tophat"
item_state = "that"
/obj/item/clothing/head/collectable/captain
- name = "Collectable Captain's Hat"
+ name = "collectable captain's hat"
desc = "A Collectable Hat that'll make you look just like a real comdom!"
icon_state = "captain"
item_state = "caphat"
/obj/item/clothing/head/collectable/police
- name = "Collectable Police Officer's Hat"
+ name = "collectable police officer's hat"
desc = "A Collectable Police Officer's Hat. This hat emphasizes that you are THE LAW."
icon_state = "policehelm"
/obj/item/clothing/head/collectable/beret
- name = "Collectable Beret"
- desc = "A Collectable red beret. It smells faintly of garlic."
+ name = "collectable beret"
+ desc = "A Collectable red Beret. It smells faintly of Garlic."
icon_state = "beret"
/obj/item/clothing/head/collectable/welding
- name = "Collectable Welding Helmet"
+ name = "collectable welding helmet"
desc = "A Collectable Welding Helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this Helmet is done so at the owner's own risk!"
icon_state = "welding"
item_state = "welding"
/obj/item/clothing/head/collectable/slime
- name = "Collectable Slime Hat"
+ name = "collectable slime hat"
desc = "Just like a real Brain Slug!"
icon_state = "headslime"
item_state = "headslime"
/obj/item/clothing/head/collectable/flatcap
- name = "Collectable Flat Cap"
+ name = "collectable flat cap"
desc = "A Collectible farmer's Flat Cap!"
icon_state = "flat_cap"
item_state = "detective"
/obj/item/clothing/head/collectable/pirate
- name = "Collectable Pirate Hat"
+ name = "collectable pirate hat"
desc = "You'd make a great Dread Syndie Roberts!"
icon_state = "pirate"
item_state = "pirate"
/obj/item/clothing/head/collectable/kitty
- name = "Collectable Kitty Ears"
+ name = "collectable kitty ears"
desc = "The fur feels.....a bit too realistic."
icon_state = "kitty"
item_state = "kitty"
/obj/item/clothing/head/collectable/rabbitears
- name = "Collectable Rabbit Ears"
+ name = "collectable rabbit ears"
desc = "Not as lucky as the feet!"
icon_state = "bunny"
item_state = "bunny"
/obj/item/clothing/head/collectable/wizard
- name = "Collectable Wizard's Hat"
+ name = "collectable wizard's hat"
desc = "NOTE:Any magical powers gained from wearing this hat are purely coincidental."
icon_state = "wizard"
/obj/item/clothing/head/collectable/hardhat
- name = "Collectable Hard Hat"
+ name = "collectable hard hat"
desc = "WARNING! Offers no real protection, or luminosity, but it is damn fancy!"
icon_state = "hardhat0_yellow"
item_state = "hardhat0_yellow"
/obj/item/clothing/head/collectable/HoS
- name = "Collectable HoS Hat"
+ name = "collectable HoS hat"
desc = "Now you can beat prisoners, set silly sentences and arrest for no reason too!"
icon_state = "hoscap"
/obj/item/clothing/head/collectable/thunderdome
- name = "Collectable Thunderdome helmet"
+ name = "collectable Thunderdome helmet"
desc = "Go Red! I mean Green! I mean Red! No Green!"
icon_state = "thunderdome"
item_state = "thunderdome"
/obj/item/clothing/head/collectable/swat
- name = "Collectable SWAT Helmet"
+ name = "collectable SWAT helmet"
desc = "Now you can be in the Deathsquad too!"
icon_state = "swat"
item_state = "swat"
@@ -504,7 +512,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|FEET
/obj/item/clothing/under/sexymime
- name = "Sexy mime outfit"
+ name = "sexy mime outfit"
desc = "The only time when you DON'T enjoy looking at someone's rack."
icon_state = "sexymime"
item_state = "sexymime"
@@ -519,7 +527,7 @@
flags = FPRINT | TABLEPASS
/obj/item/clothing/head/justice
- name = "Justice Hat"
+ name = "justice hat"
desc = "Fight for what's righteous!"
icon_state = "justicered"
item_state = "justicered"
@@ -542,11 +550,12 @@
item_state = "justicepink"
obj/item/clothing/suit/justice
- name = "Justice Suit"
+ name = "justice suit"
desc = "This pretty much looks ridiculous."
icon_state = "justice"
item_state = "justice"
flags = FPRINT | TABLEPASS
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
/obj/item/clothing/under/gladiator
name = "gladiator uniform"
@@ -561,7 +570,8 @@ obj/item/clothing/suit/justice
desc = "Ave, Imperator, morituri te salutant."
icon_state = "gladiator"
flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
- item_state="gladiator"
+ item_state = "gladiator"
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
//stylish new hats
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 434d7d01bfd..252dc6349e7 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -29,12 +29,12 @@
if(ismob(AM))
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
- /*if(prob(70))
- for(var/mob/M in viewers(src, null))
- if(M.client)
- M << "\red [src] fails to push [tmob]'s fat ass out of the way."
+/*
+ if(prob(70))
+ src << "\red You fail to push [tmob]'s fat ass out of the way."
now_pushing = 0
- return*/
+ return
+*/
if(tmob.nopush)
now_pushing = 0
return
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 7e0e99380d5..c3356f4d644 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -97,13 +97,16 @@
now_pushing = 1
if(ismob(AM))
var/mob/tmob = AM
- /*if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
+/*
+ if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
if(prob(70))
- for(var/mob/M in viewers(src, null))
- if(M.client)
- M << "\red [src] fails to push [tmob]'s fat ass out of the way."
+ usr << "\red You fail to push [tmob]'s fat ass out of the way."
now_pushing = 0
- return*/
+ return
+*/
+ if(tmob.nopush)
+ now_pushing = 0
+ return
tmob.LAssailant = src
now_pushing = 0
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 29f43b6128c..469395cd2b6 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -106,6 +106,7 @@
if (sprite == "Non-Humanoid")
src.icon_state = "surgeon"
modtype = "Med"
+ nopush = 1
channels = list("Medical" = 1)
if("Security")
@@ -262,16 +263,18 @@
if ((!( yes ) || now_pushing))
return
now_pushing = 1
- /*if(ismob(AM))
+ if(ismob(AM))
var/mob/tmob = AM
+/*
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
if(prob(20))
- for(var/mob/M in viewers(src, null))
- if(M.client)
- M << M << "\red [src] fails to push [tmob]'s fat ass out of the way."
+ usr << "\red You fail to push [tmob]'s fat ass out of the way."
now_pushing = 0
- //unlock_medal("That's No Moon, That's A Gourmand!", 1)
- return*/
+ return
+*/
+ if(tmob.nopush)
+ now_pushing = 0
+ return
now_pushing = 0
..()
if (istype(AM, /obj/machinery/recharge_station))
diff --git a/code/modules/mob/simple_animal/shade.dm b/code/modules/mob/simple_animal/shade.dm
index 480d7bc8c0a..34034a63df6 100644
--- a/code/modules/mob/simple_animal/shade.dm
+++ b/code/modules/mob/simple_animal/shade.dm
@@ -21,6 +21,7 @@
max_co2 = 0
max_tox = 0
speed = -1
+ stop_automated_movement = 1
Life()
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index e5365fe3408..bc5e765cab7 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -126,6 +126,10 @@
if(istype(W, /obj/item/weapon/wirecutters))
+ if(power_switch)
+ user << "\red This piece of cable is tied to a power switch. Flip the switch to remove it."
+ return
+
if (shock(user, 50))
return
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index c657ec114c0..01f9160cec1 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -527,3 +527,19 @@ var/global/list/uneatable = list(
target << "\red NAR-SIE HUNGERS FOR YOUR SOUL"
else
target << "\red NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL"
+
+
+
+/obj/machinery/singularity/narsie/wizard
+ grav_pull = 0
+ eat()
+ set background = 1
+ if(defer_powernet_rebuild != 2)
+ defer_powernet_rebuild = 1
+ for(var/atom/movable/X in orange(consume_range,src))
+ consume(X)
+ for(var/turf/X in orange(consume_range,src))
+ consume(X)
+ if(defer_powernet_rebuild != 2)
+ defer_powernet_rebuild = 0
+ return
\ No newline at end of file
diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm
new file mode 100644
index 00000000000..9b94838dbe8
--- /dev/null
+++ b/code/modules/power/switch.dm
@@ -0,0 +1,84 @@
+//This is a power switch. When turned on it looks at the cables around the tile that it's on and notes which cables are trying to connect to it.
+//After it knows this it creates the number of cables from the center to each of the cables attempting to conenct. These cables cannot be removed
+//with wirecutters. When the switch is turned off it removes all the cables on the tile it's on.
+//The switch uses a 5s delay to prevent powernet change spamming.
+
+/obj/structure/powerswitch
+ name = "power switch"
+ desc = "A switch that controls power."
+ icon = 'power.dmi'
+ icon_state = "switch-dbl-up"
+ var/icon_state_on = "switch-dbl-down"
+ var/icon_state_off = "switch-dbl-up"
+ flags = FPRINT
+ density = 0
+ anchored = 1
+ var/on = 0 //up is off, down is on
+ var/busy = 0 //set to 1 when you start pulling
+
+ simple
+ icon_state = "switch-up"
+ icon_state_on = "switch-down"
+ icon_state_off = "switch-up"
+
+
+ examine()
+ ..()
+ if(on)
+ usr << "The switch is in the on position"
+ else
+ usr << "The switch is in the off position"
+
+ attack_ai(mob/user)
+ user << "\red You're an AI. This is a manual switch. It's not going to work."
+ return
+
+ attack_hand(mob/user)
+
+ if(busy)
+ user << "\red This switch is already being toggled."
+ return
+
+ ..()
+
+ busy = 1
+ for(var/mob/O in viewers(user))
+ O.show_message(text("\red [user] started pulling the [src]."), 1)
+
+ if(do_after(user, 50))
+ set_state(!on)
+ for(var/mob/O in viewers(user))
+ O.show_message(text("\red [user] flipped the [src] into the [on ? "on": "off"] position."), 1)
+ busy = 0
+
+ proc/set_state(var/state)
+ on = state
+ if(on)
+ icon_state = icon_state_on
+ var/list/connection_dirs = list()
+ for(var/direction in list(1,2,4,8,5,6,9,10))
+ for(var/obj/structure/cable/C in get_step(src,direction))
+ if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180))
+ connection_dirs += direction
+ break
+
+ for(var/direction in connection_dirs)
+ var/obj/structure/cable/C = new/obj/structure/cable(src.loc)
+ C.d1 = 0
+ C.d2 = direction
+ C.icon_state = "[C.d1]-[C.d2]"
+ C.power_switch = src
+
+ var/datum/powernet/PN = new()
+ PN.number = powernets.len + 1
+ powernets += PN
+ C.netnum = PN.number
+ PN.cables += C
+
+ C.mergeConnectedNetworks(C.d2)
+ C.mergeConnectedNetworksOnTurf()
+
+ else
+ icon_state = icon_state_off
+ for(var/obj/structure/cable/C in src.loc)
+ del(C)
\ No newline at end of file
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 345fbb94b93..80d0c99c90d 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -525,6 +525,7 @@ datum
build_path = "/obj/item/weapon/aiModule/tyrant"
+
///////////////////////////////////
/////Subspace Telecomms////////////
///////////////////////////////////
@@ -794,13 +795,13 @@ datum
req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3)
build_path = "/obj/item/mecha_parts/mecha_equipment/repair_droid"
- mech_generator
+ mech_plasma_generator
name = "Exosuit Module Design (Plasma Converter Module)"
desc = "Exosuit-mounted plasma converter."
id = "mech_plasma_generator"
build_type = MECHFAB
req_tech = list("plasmatech" = 2, "powerstorage"= 2, "engineering" = 2)
- build_path = "/obj/item/mecha_parts/mecha_equipment/generator"
+ build_path = "/obj/item/mecha_parts/mecha_equipment/plasma_generator"
mech_energy_relay
name = "Exosuit Module Design (Tesla Energy Relay)"
diff --git a/html/add-to-changelog.html b/html/add-to-changelog.html
new file mode 100644
index 00000000000..feefa633dc5
--- /dev/null
+++ b/html/add-to-changelog.html
@@ -0,0 +1,77 @@
+
+
+
+
+ New commit
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi
index feca6f8a139..017702505ce 100644
Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ
diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi
index a9319fe1aa4..32961b5a0ac 100644
Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index c05f6f7b73e..ef050d19e50 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 907789f99ca..8650435b56e 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index c63cee784f8..064e2442c39 100755
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -1956,7 +1956,7 @@
"aLF" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/chapel/office)
"aLG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/obj/structure/table/woodentable,/obj/structure/disposalpipe/segment,/obj/machinery/light/lamp/green{pixel_x = 1; pixel_y = 5},/obj/effect/deskclutter,/turf/simulated/floor{dir = 8; icon_state = "carpetside"},/area/chapel/office)
"aLH" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/briefcase,/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/chapel/office)
-"aLI" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/chapel/office)
+"aLI" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/obj/item/weapon/nullrod,/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/chapel/office)
"aLJ" = (/turf/simulated/floor{dir = 4; icon_state = "carpetside"},/area/chapel/office)
"aLK" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"aLL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/hallway/secondary/exit)
diff --git a/tools/DM Line counter.exe b/tools/DM Line counter.exe
new file mode 100644
index 00000000000..d6b075d6313
Binary files /dev/null and b/tools/DM Line counter.exe differ