diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 594cb2d43fa..94da0533b1a 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -51,6 +51,65 @@
#define FIRE_LAYER 1 //If you're on fire
#define TOTAL_LAYERS 26 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
+//Human Overlay Index Shortcuts for alternate_worn_layer, layers
+//Because I *KNOW* somebody will think layer+1 means "above"
+//IT DOESN'T OK, IT MEANS "UNDER"
+#define UNDER_SPECIES_LAYER SPECIES_LAYER+1
+#define UNDER_BODY_BEHIND_LAYER BODY_BEHIND_LAYER+1
+#define UNDER_BODY_LAYER BODY_LAYER+1
+#define UNDER_BODY_ADJ_LAYER BODY_ADJ_LAYER+1
+#define UNDER_MUTATIONS_LAYER MUTATIONS_LAYER+1
+#define UNDER_AUGMENTS_LAYER AUGMENTS_LAYER+1
+#define UNDER_DAMAGE_LAYER DAMAGE_LAYER+1
+#define UNDER_UNIFORM_LAYER UNIFORM_LAYER+1
+#define UNDER_ID_LAYER ID_LAYER+1
+#define UNDER_SHOES_LAYER SHOES_LAYER+1
+#define UNDER_GLOVES_LAYER GLOVES_LAYER+1
+#define UNDER_EARS_LAYER EARS_LAYER+1
+#define UNDER_SUIT_LAYER SUIT_LAYER+1
+#define UNDER_GLASSES_LAYER GLASSES_LAYER+1
+#define UNDER_BELT_LAYER BELT_LAYER+1
+#define UNDER_SUIT_STORE_LAYER SUIT_STORE_LAYER+1
+#define UNDER_BACK_LAYER BACK_LAYER+1
+#define UNDER_HAIR_LAYER HAIR_LAYER+1
+#define UNDER_FACEMASK_LAYER FACEMASK_LAYER+1
+#define UNDER_HEAD_LAYER HEAD_LAYER+1
+#define UNDER_HANDCUFF_LAYER HANDCUFF_LAYER+1
+#define UNDER_LEGCUFF_LAYER LEGCUFF_LAYER+1
+#define UNDER_L_HAND_LAYER L_HAND_LAYER+1
+#define UNDER_R_HAND_LAYER R_HAND_LAYER+1
+#define UNDER_BODY_FRONT_LAYER BODY_FRONT_LAYER+1
+#define UNDER_FIRE_LAYER FIRE_LAYER+1
+
+//AND -1 MEANS "ABOVE", OK?, OK!?!
+#define ABOVE_SPECIES_LAYER SPECIES_LAYER-1
+#define ABOVE_BODY_BEHIND_LAYER BODY_BEHIND_LAYER-1
+#define ABOVE_BODY_LAYER BODY_LAYER-1
+#define ABOVE_BODY_ADJ_LAYER BODY_ADJ_LAYER-1
+#define ABOVE_MUTATIONS_LAYER MUTATIONS_LAYER-1
+#define ABOVE_AUGMENTS_LAYER AUGMENTS_LAYER-1
+#define ABOVE_DAMAGE_LAYER DAMAGE_LAYER-1
+#define ABOVE_UNIFORM_LAYER UNIFORM_LAYER-1
+#define ABOVE_ID_LAYER ID_LAYER-1
+#define ABOVE_SHOES_LAYER SHOES_LAYER-1
+#define ABOVE_GLOVES_LAYER GLOVES_LAYER-1
+#define ABOVE_EARS_LAYER EARS_LAYER-1
+#define ABOVE_SUIT_LAYER SUIT_LAYER-1
+#define ABOVE_GLASSES_LAYER GLASSES_LAYER-1
+#define ABOVE_BELT_LAYER BELT_LAYER-1
+#define ABOVE_SUIT_STORE_LAYER SUIT_STORE_LAYER-1
+#define ABOVE_BACK_LAYER BACK_LAYER-1
+#define ABOVE_HAIR_LAYER HAIR_LAYER-1
+#define ABOVE_FACEMASK_LAYER FACEMASK_LAYER-1
+#define ABOVE_HEAD_LAYER HEAD_LAYER-1
+#define ABOVE_HANDCUFF_LAYER HANDCUFF_LAYER-1
+#define ABOVE_LEGCUFF_LAYER LEGCUFF_LAYER-1
+#define ABOVE_L_HAND_LAYER L_HAND_LAYER-1
+#define ABOVE_R_HAND_LAYER R_HAND_LAYER-1
+#define ABOVE_BODY_FRONT_LAYER BODY_FRONT_LAYER-1
+#define ABOVE_FIRE_LAYER FIRE_LAYER-1
+
+
//Security levels
#define SEC_LEVEL_GREEN 0
#define SEC_LEVEL_BLUE 1
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 7f1b1755d3b..042e8ab3529 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -36,8 +36,6 @@
viruses += DD
DD.affected_mob = src
DD.holder = src
- if(DD.disease_flags & CAN_CARRY && prob(5))
- DD.carrier = 1
//Copy properties over. This is so edited diseases persist.
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
diff --git a/code/game/gamemodes/abduction/machinery/experiment.dm b/code/game/gamemodes/abduction/machinery/experiment.dm
index e1c6bd42951..688637f630f 100644
--- a/code/game/gamemodes/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/abduction/machinery/experiment.dm
@@ -137,7 +137,7 @@
if(H.stat == DEAD)
say("Specimen deceased - please provide fresh sample.")
return "Specimen deceased."
- var/obj/item/organ/internal/gland/GlandTest = locate() in H
+ var/obj/item/organ/internal/gland/GlandTest = locate() in H.internal_organs
if(!GlandTest)
say("Experimental dissection not detected!")
return "No glands detected!"
@@ -165,7 +165,7 @@
H << "Objective #[obj_count]: [objective.explanation_text]"
obj_count++
- for(var/obj/item/organ/internal/gland/G in H)
+ for(var/obj/item/organ/internal/gland/G in H.internal_organs)
G.Start()
point_reward++
if(point_reward > 0)
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
index c8e42325e8c..898f558d087 100644
--- a/code/game/gamemodes/gang/dominator.dm
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -37,7 +37,7 @@
..()
if(gang && isnum(gang.dom_timer))
if(gang.dom_timer > 0)
- playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ playsound(loc, 'sound/items/timer.ogg', 10, 0)
if(!warned && (gang.dom_timer < 180))
warned = 1
var/area/domloc = get_area(loc)
@@ -169,7 +169,7 @@
var/time = round(get_domination_time(tempgang)/60,0.1)
if(alert(user,"With [round((tempgang.territory.len/start_state.num_territories)*100, 1)]% station control, a takeover will require [time] minutes.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nYou have [tempgang.dom_attempts] attempt(s) remaining. Are you ready?","Confirm","Ready","Later") == "Ready")
- if (!tempgang.dom_attempts || !in_range(src, user) || !istype(src.loc, /turf))
+ if (isnum(tempgang.dom_timer) || !tempgang.dom_attempts || !in_range(src, user) || !istype(src.loc, /turf))
return 0
var/area/A = get_area(loc)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index e6174cdf764..9a8b8ab9482 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -172,10 +172,11 @@
var/mob/living/carbon/human/user = usr
listclearnulls(ticker.mode.thralls)
if(!shadowling_check(usr)) return
- if(ticker.mode.thralls.len >= 5)
- user << "With your telepathic abilities suppressed, your human form will not allow you to enthrall any others. Hatch first."
- charge_counter = charge_max
- return
+ if(user.dna.species.id != "shadowling")
+ if(ticker.mode.thralls.len >= 5)
+ user << "With your telepathic abilities suppressed, your human form will not allow you to enthrall any others. Hatch first."
+ charge_counter = charge_max
+ return
for(var/mob/living/carbon/human/target in targets)
if(!in_range(usr, target))
usr << "You need to be closer to enthrall [target]."
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 2af85ca36ba..7d345e71a3b 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -90,4 +90,4 @@ Head of Personnel
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- announce_head(H.mind, list("Supply", "Service")) //tell underlings (suuply/service) they have a head
+ announce_head(H, list("Supply", "Service")) //tell underlings (suuply/service) they have a head
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index fa8f10f9eff..1d7961293cf 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -41,7 +41,7 @@ Chief Engineer
//Equip telebaton
H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- announce_head(H.mind, list("Engineering")) //tell underlings (engineering radio) they have a head
+ announce_head(H, list("Engineering")) //tell underlings (engineering radio) they have a head
/*
Station Engineer
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index fe7638427f8..c688e4a4303 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -169,8 +169,8 @@
/datum/job/proc/config_check()
return 1
-/datum/job/proc/announce_head(var/datum/mind/o_mind, var/channels) //tells the given channel that the given mind is the new department head. See communications.dm for valid channels.
+/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels.
spawn(4) //to allow some initialization
if(announcement_systems.len)
var/obj/machinery/announcement_system/announcer = pick(announcement_systems)
- announcer.announce("NEWHEAD", o_mind.name, o_mind.assigned_role, channels)
+ announcer.announce("NEWHEAD", H.real_name, H.job, channels)
\ No newline at end of file
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 7485f8442ca..6943b3e27eb 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -35,7 +35,7 @@ Chief Medical Officer
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- announce_head(H.mind, list("Medical")) //tell underlings (medical radio) they have a head
+ announce_head(H, list("Medical")) //tell underlings (medical radio) they have a head
/*
Medical Doctor
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 9f571c85ea2..f6b4c365bb8 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -37,7 +37,7 @@ Research Director
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- announce_head(H.mind, list("Science")) //tell underlings (science radio) they have a head
+ announce_head(H, list("Science")) //tell underlings (science radio) they have a head
/*
Scientist
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 2d8bdefcbde..616c05e9a05 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -52,7 +52,7 @@ Head of Security
L.implanted = 1
H.sec_hud_set_implants()
- announce_head(H.mind, list("Security")) //tell underlings (security radio) they have a head
+ announce_head(H, list("Security")) //tell underlings (security radio) they have a head
/*
Warden
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index e69df9c883c..738d69b14cf 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -184,13 +184,11 @@ var/list/announcement_systems = list()
newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.")
/obj/machinery/announcement_system/emp_act(severity)
- if(stat & (NOPOWER|BROKEN))
- ..(severity)
- return
- act_up()
+ if(!(stat & (NOPOWER|BROKEN)))
+ act_up()
..(severity)
/obj/machinery/announcement_system/emag_act()
- ..()
- emagged = 1
- act_up()
\ No newline at end of file
+ if(!emagged)
+ emagged = 1
+ act_up()
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 82b4a8d59fb..68643c28cb6 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -14,11 +14,11 @@ var/global/mulebot_count = 0
density = 1
anchored = 1
animate_movement=1
- health = 150 //yeah, it's tougher than ed209 because it is a big metal box with wheels --rastaf0
+ health = 150
maxhealth = 150
fire_dam_coeff = 0.7
brute_dam_coeff = 0.5
- var/atom/movable/load = null // the loaded crate (usually)
+ var/atom/movable/load = null
bot_type = MULE_BOT
model = "MULE"
blood_DNA = list()
@@ -28,7 +28,7 @@ var/global/mulebot_count = 0
var/turf/target // this is turf to navigate to (location of beacon)
var/loaddir = 0 // this the direction to unload onto/load from
var/home_destination = "" // tag of home beacon
- req_access = list(access_cargo) // added robotics access so assembly line drop-off works properly -veyveyr //I don't think so, Tim. You need to add it to the MULE's hidden robot ID card. -NEO
+ req_access = list(access_cargo)
mode = BOT_IDLE
@@ -62,7 +62,6 @@ var/global/mulebot_count = 0
var/datum/job/cargo_tech/J = new/datum/job/cargo_tech
botcard.access = J.get_access()
prev_access = botcard.access
-// botcard.access += access_robotics //Why --Ikki
cell = new(src)
cell.charge = 2000
cell.maxcharge = 2000
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index df0ac9636d1..42184779a12 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -298,12 +298,27 @@
// *** THE ORION TRAIL ** //
+#define ORION_TRAIL_WINTURN 9
+
+//Orion Trail Events
+#define ORION_TRAIL_RAIDERS "Raiders"
+#define ORION_TRAIL_FLUX "Interstellar Flux"
+#define ORION_TRAIL_ILLNESS "Illness"
+#define ORION_TRAIL_BREAKDOWN "Breakdown"
+#define ORION_TRAIL_LING "Changelings?"
+#define ORION_TRAIL_LING_ATTACK "Changeling Ambush"
+#define ORION_TRAIL_MALFUNCTION "Malfunction"
+#define ORION_TRAIL_COLLISION "Collision"
+#define ORION_TRAIL_SPACEPORT "Spaceport"
+#define ORION_TRAIL_BLACKHOLE "BlackHole"
+
/obj/machinery/computer/arcade/orion_trail
name = "The Orion Trail"
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
+ var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game.
var/engine = 0
var/hull = 0
var/electronics = 0
@@ -316,15 +331,21 @@
var/eventdat = null
var/event = null
var/list/settlers = list("Harry","Larry","Bob")
- var/list/events = list("Raiders" = 3,
- "Interstellar Flux" = 1,
- "Illness" = 3,
- "Breakdown" = 2,
- "Malfunction" = 2,
- "Collision" = 1
+ var/list/events = list(ORION_TRAIL_RAIDERS = 3,
+ ORION_TRAIL_FLUX = 1,
+ ORION_TRAIL_ILLNESS = 3,
+ ORION_TRAIL_BREAKDOWN = 2,
+ ORION_TRAIL_LING = 3,
+ ORION_TRAIL_MALFUNCTION = 2,
+ ORION_TRAIL_COLLISION = 1,
+ ORION_TRAIL_SPACEPORT = 2
)
var/list/stops = list()
var/list/stopblurbs = list()
+ var/lings_aboard = 0
+ var/spaceport_raided = 0
+ var/spaceport_freebie = 0
+ var/last_spaceport_action = ""
/obj/machinery/computer/arcade/orion_trail/New()
..()
@@ -345,14 +366,9 @@
/obj/machinery/computer/arcade/orion_trail/proc/newgame()
// Set names of settlers in crew
settlers = list()
- var/choice = null
for(var/i = 1; i <= 3; i++)
- if(prob(50))
- choice = pick(first_names_male)
- else
- choice = pick(first_names_female)
- settlers += choice
- settlers += "[usr]"
+ add_crewmember()
+ add_crewmember("[usr]")
// Re-set items to defaults
engine = 1
hull = 1
@@ -364,6 +380,12 @@
event = null
playing = 1
gameover = 0
+ lings_aboard = 0
+
+ //spaceport junk
+ spaceport_raided = 0
+ spaceport_freebie = 0
+ last_spaceport_action = ""
/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user)
if(..())
@@ -412,18 +434,19 @@
dat += "
Crew:
"
dat += english_list(settlers)
dat += "
Food: [food] | Fuel: [fuel]"
- dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]
"
+ dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
if(turns == 7)
dat += "Go Around Continue
"
else
dat += "Continue
"
+ dat += "Kill a crewmember
"
dat += "Close
"
else
dat = "The Orion Trail
"
dat += "
Experience the journey of your ancestors!
"
dat += "New Game"
dat += "Close
"
- var/datum/browser/popup = new(user, "arcade", "The Orion Trail")
+ var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
@@ -435,34 +458,31 @@
if(href_list["close"])
usr.unset_machine()
usr << browse(null, "window=arcade")
- else if (href_list["continue"]) //Continue your travels
- if(turns >= 9)
+
+ if(busy)
+ return
+ busy = 1
+
+ if (href_list["continue"]) //Continue your travels
+ if(turns >= ORION_TRAIL_WINTURN)
win()
- else if(turns == 2)
- if(prob(30))
- event = "Collision"
- event()
- food -= alive*2
- fuel -= 5
- turns += 1
- else
- food -= alive*2
- fuel -= 5
- turns += 1
- if(prob(75))
- event = pickweight(events)
- event()
else
- food -= alive*2
+ food -= (alive+lings_aboard)*2
fuel -= 5
- turns += 1
- if(prob(75))
- event = pickweight(events)
+ if(turns == 2 && prob(30))
+ event = ORION_TRAIL_COLLISION
event()
+ else if(prob(75))
+ event = pickweight(events)
+ if(lings_aboard)
+ if(event == ORION_TRAIL_LING || prob(55))
+ event = ORION_TRAIL_LING_ATTACK
+ event()
+ turns += 1
if(emagged)
var/mob/living/carbon/M = usr //for some vars
switch(event)
- if("Raiders")
+ if(ORION_TRAIL_RAIDERS)
if(prob(50))
usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?"
M.hallucination += 30
@@ -470,7 +490,7 @@
usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..."
M.take_organ_damage(30)
playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1)
- if("Illness")
+ if(ORION_TRAIL_ILLNESS)
var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS
if(severity == 1)
M << "You suddenly feel slightly nauseous." //got off lucky
@@ -481,38 +501,38 @@
M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit."
M.Stun(5)
sleep(30)
- M.visible_message("[M] throws up!", "You violently throw up!")
+ say("[M] violently throws up!")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
M.nutrition -= 50 //lose a lot of food
var/turf/location = usr.loc
if(istype(location, /turf/simulated))
location.add_vomit_floor(src, 1)
- if("Interstellar Flux")
+ if(ORION_TRAIL_FLUX)
if(prob(75))
M.Weaken(3)
- M.visible_message("[M] is swept off their feet!", "A sudden gust of powerful wind slams you into the floor!")
+ say("A sudden gust of powerful wind slams [M] into the floor!")
M.take_organ_damage(25)
playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
else
M << "A violent gale blows past you, and you barely manage to stay standing!"
- if("Collision") //by far the most damaging event
+ if(ORION_TRAIL_COLLISION) //by far the most damaging event
if(prob(90))
playsound(src.loc, 'sound/effects/bang.ogg', 100, 1)
var/turf/simulated/floor/F
for(F in orange(1, src))
F.ChangeTurf(F.baseturf)
- src.visible_message("Something slams into the floor around [src], exposing it to space!")
+ say("Something slams into the floor around [src], exposing it to space!")
if(hull)
sleep(10)
- src.visible_message("A new floor suddenly appears around [src]. What the hell?")
+ say("A new floor suddenly appears around [src]. What the hell?")
playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
var/turf/space/T
for(T in orange(1, src))
T.ChangeTurf(/turf/simulated/floor/plating/)
else
- src.visible_message("Something slams into the floor around [src] - luckily, it didn't get through!")
+ say("Something slams into the floor around [src] - luckily, it didn't get through!")
playsound(src.loc, 'sound/effects/bang.ogg', 50, 1)
- if("Malfunction")
+ if(ORION_TRAIL_MALFUNCTION)
playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1)
src.visible_message("[src] malfunctions, randomizing in-game stats!")
var/oldfood = food
@@ -529,7 +549,6 @@
fuel = oldfuel
playsound(src.loc, 'sound/machines/chime.ogg', 50, 1)
-
else if(href_list["newgame"]) //Reset everything
newgame()
else if(href_list["menu"]) //back to the main menu
@@ -540,11 +559,11 @@
fuel = 60
settlers = list("Harry","Larry","Bob")
else if(href_list["slow"]) //slow down
- food -= alive*2
+ food -= (alive+lings_aboard)*2
fuel -= 5
event = null
else if(href_list["pastblack"]) //slow down
- food -= (alive*2)*3
+ food -= ((alive+lings_aboard)*2)*3
fuel -= 15
turns += 1
event = null
@@ -558,7 +577,7 @@
hull -= 1
event = null
else if(href_list["wait"]) //wait 3 days
- food -= (alive*2)*3
+ food -= ((alive+lings_aboard)*2)*3
event = null
else if(href_list["keepspeed"]) //keep speed
if(prob(75))
@@ -568,16 +587,16 @@
event = null
else if(href_list["blackhole"]) //keep speed past a black hole
if(prob(75))
- event = "BlackHole"
+ event = ORION_TRAIL_BLACKHOLE
event()
if(emagged) //has to be here because otherwise it doesn't work
playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1)
- src.visible_message("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!")
+ say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!")
usr.Stun(10) //you can't run :^)
var/S = new /obj/singularity/academy(usr.loc)
emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting
sleep(50)
- src.visible_message("[S] winks out, just as suddenly as it appeared.")
+ say("[S] winks out, just as suddenly as it appeared.")
qdel(S)
else
event = null
@@ -588,88 +607,378 @@
else if(href_list["eventclose"]) //end an event
event = null
+ else if(href_list["killcrew"]) //shoot a crewmember
+ var/sheriff = remove_crewmember() //I shot the sheriff
+ playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1)
+
+ if(settlers.len == 0 || alive == 0)
+ say("The last crewmember [sheriff], shot themselves, GAME OVER!")
+ if(emagged)
+ usr.death(0)
+ emagged = 0
+ gameover = 1
+ event = null
+ else if(emagged)
+ if(usr.name == sheriff)
+ say("The crew of the ship chose to kill [usr.name]!")
+ usr.death(0)
+
+ if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places
+ event = null
+
+ //Spaceport specific interactions
+ //they get a header because most of them don't reset event (because it's a shop, you leave when you want to)
+ //they also call event() again, to regen the eventdata, which is kind of odd but necessary
+ else if(href_list["buycrew"]) //buy a crewmember
+ var/bought = add_crewmember()
+ last_spaceport_action = "You hired [bought] as a new crewmember."
+ fuel -= 10
+ food -= 10
+ event()
+
+ else if(href_list["sellcrew"]) //sell a crewmember
+ var/sold = remove_crewmember()
+ last_spaceport_action = "You sold your crewmember, [sold]!"
+ fuel += 15
+ food += 15
+ event()
+
+ else if(href_list["leave_spaceport"])
+ event = null
+ spaceport_raided = 0
+ spaceport_freebie = 0
+ last_spaceport_action = ""
+
+ else if(href_list["raid_spaceport"])
+ var/success = min(15 * alive,100) //default crew (4) have a 60% chance
+ spaceport_raided = 1
+
+ var/FU = 0
+ var/FO = 0
+ if(prob(success))
+ FU = rand(5,15)
+ FO = rand(5,15)
+ last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)"
+ else
+ FU = rand(-5,-15)
+ FO = rand(-5,-15)
+ last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)"
+
+ //your chance of lose a crewmember is 1/2 your chance of success
+ //this makes higher % failures hurt more, don't get cocky space cowboy!
+ if(prob(success*5))
+ var/lost_crew = remove_crewmember()
+ last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)"
+ if(emagged)
+ say("WEEWOO WEEWOO, Spaceport Security en route!")
+ for(var/i, i<=3, i++)
+ var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src))
+ O.target = usr
+
+
+ fuel += FU
+ food += FO
+ event()
+
+ else if(href_list["buyparts"])
+ switch(text2num(href_list["buyparts"]))
+ if(1) //Engine Parts
+ engine++
+ last_spaceport_action = "Bought Engine Parts"
+ if(2) //Hull Plates
+ hull++
+ last_spaceport_action = "Bought Hull Plates"
+ if(3) //Spare Electronics
+ electronics++
+ last_spaceport_action = "Bought Spare Electronics"
+ fuel -= 5 //they all cost 5
+ event()
+
+ else if(href_list["trade"])
+ switch(text2num(href_list["trade"]))
+ if(1) //Fuel
+ fuel -= 5
+ food += 5
+ last_spaceport_action = "Traded Fuel for Food"
+ if(2) //Food
+ fuel += 5
+ food -= 5
+ last_spaceport_action = "Traded Food for Fuel"
+ event()
+
src.add_fingerprint(usr)
src.updateUsrDialog()
+ busy = 0
return
/obj/machinery/computer/arcade/orion_trail/proc/event()
eventdat = "[event]
"
- if(event == "Raiders")
- eventdat += "Raiders have come aboard your ship!"
+
+ switch(event)
+ if(ORION_TRAIL_RAIDERS)
+ eventdat += "Raiders have come aboard your ship!"
+ if(prob(50))
+ var/sfood = rand(1,10)
+ var/sfuel = rand(1,10)
+ food -= sfood
+ fuel -= sfuel
+ eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel."
+ else if(prob(10))
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] tried to fight back but was killed."
+ else
+ eventdat += "
Fortunately you fended them off without any trouble."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_FLUX)
+ eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies."
+ eventdat += "
What will you do?"
+ eventdat += "Slow Down Continue
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_ILLNESS)
+ eventdat += "A deadly illness has been contracted!"
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] was killed by the disease."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_BREAKDOWN)
+ eventdat += "Oh no! The engine has broken down!"
+ eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days."
+ if(engine >= 1)
+ eventdat += "Use PartWait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_MALFUNCTION)
+ eventdat += "The ship's systems are malfunctioning!"
+ eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI."
+ if(electronics >= 1)
+ eventdat += "Use PartWait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_COLLISION)
+ eventdat += "Something hit us! Looks like there's some hull damage."
+ if(prob(25))
+ var/sfood = rand(5,15)
+ var/sfuel = rand(5,15)
+ food -= sfood
+ fuel -= sfuel
+ eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space."
+ if(prob(10))
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] was killed by rapid depressurization."
+ eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together."
+ if(hull >= 1)
+ eventdat += "Use PartWait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_BLACKHOLE)
+ eventdat += "You were swept away into the black hole."
+ eventdat += "Oh...
"
+ eventdat += "Close
"
+ settlers = list()
+
+ if(ORION_TRAIL_LING)
+ eventdat += "Strange reports warn of changelings infiltrating crews on trips to Orion..."
+ if(settlers.len <= 1)
+ eventdat += "
Your crew's chance of reaching Orion is so slim the changelings likely avoided your ship..."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ if(prob(10)) // "likely", I didn't say it was guaranteed!
+ lings_aboard = min(++lings_aboard,2)
+ else
+ if(lings_aboard) //less likely to stack lings
+ if(prob(20))
+ lings_aboard = min(++lings_aboard,2)
+ else if(prob(70))
+ lings_aboard = min(++lings_aboard,2)
+
+ eventdat += "Kill a crewmember
"
+ eventdat += "Risk it
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_LING_ATTACK)
+ if(lings_aboard <= 0) //shouldn't trigger, but hey.
+ eventdat += "Haha, fooled you, there are no changelings on board!"
+ eventdat += "
(You should report this to a coder :S)"
+ else
+ var/ling1 = remove_crewmember()
+ var/ling2 = ""
+ if(lings_aboard >= 2)
+ ling2 = remove_crewmember()
+
+ eventdat += "Oh no, some of your crew are Changelings!"
+ if(ling2)
+ eventdat += "
[ling1] and [ling2]'s arms twist and contort into grotesque blades!"
+ else
+ eventdat += "
[ling1]'s arm twists and contorts into a grotesque blade!"
+
+ var/chance2attack = alive*20
+ if(prob(chance2attack))
+ var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance
+ if(prob(chancetokill))
+ var/deadguy = remove_crewmember()
+ eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!"
+ else
+ eventdat += "
You valiantly fight off the Changeling[ling2 ? "s":""]!"
+ eventdat += "
You cut the Changeling[ling2 ? "s":""] up into meat... Eww"
+ if(ling2)
+ food += 30
+ lings_aboard = max(0,lings_aboard-2)
+ else
+ food += 15
+ lings_aboard = max(0,--lings_aboard)
+ else
+ eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] away, What wimps!"
+ if(ling2)
+ lings_aboard = max(0,lings_aboard-2)
+ else
+ lings_aboard = max(0,--lings_aboard)
+
+ eventdat += "Continue
"
+ eventdat += "Close
"
+
+
+ if(ORION_TRAIL_SPACEPORT)
+ if(spaceport_raided)
+ eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!"
+ if(last_spaceport_action)
+ eventdat += "
Last Spaceport Action: [last_spaceport_action]"
+ eventdat += "Depart Spaceport
"
+ eventdat += "Close
"
+ else
+ eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!"
+ eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..."
+ eventdat += "
Trading terms: FU = Fuel, FO = Food"
+ if(last_spaceport_action)
+ eventdat += "
Last Spaceport Action: [last_spaceport_action]"
+ eventdat += "Crew:
"
+ eventdat += english_list(settlers)
+ eventdat += "
Food: [food] | Fuel: [fuel]"
+ eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
+
+
+ //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port)
+ if(!spaceport_freebie && (fuel < 20 || food < 20))
+ spaceport_freebie++
+ var/FU = 10
+ var/FO = 10
+ var/freecrew = 0
+ if(prob(30))
+ FU = 25
+ FO = 25
+
+ if(prob(10))
+ add_crewmember()
+ freecrew++
+
+ eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)"
+ if(freecrew)
+ eventdat += "
You also gain a new crewmember!"
+
+ fuel += FU
+ food += FO
+
+ //CREW INTERACTIONS
+ eventdat += "Crew Management:
"
+
+ //Buy crew
+ if(food >= 10 && fuel >= 10)
+ eventdat += "Hire a new Crewmember (-10FU,-10FO)
"
+ else
+ eventdat += "Cant afford a new Crewmember
"
+
+ //Sell crew
+ if(settlers.len > 1)
+ eventdat += "Sell crew for Fuel and Food (+15FU,+15FO)
"
+ else
+ eventdat += "Cant afford to sell a Crewmember
"
+
+ //BUY/SELL STUFF
+ eventdat += "Spare Parts:
"
+
+ //Engine parts
+ if(fuel > 5)
+ eventdat += "Buy Engine Parts (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Engine Parts"
+
+ //Hull plates
+ if(fuel > 5)
+ eventdat += "
Buy Hull Plates (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Hull Plates"
+
+ //Electronics
+ if(fuel > 5)
+ eventdat += "
Buy Spare Electronics (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Spare Electronics"
+
+ //Trade
+ if(fuel > 5)
+ eventdat += "
Trade Fuel for Food (-5FU,+5FO)
"
+ else
+ eventdat += "Cant afford to Trade Fuel for Food
5)
+ eventdat += "Trade Food for Fuel (+5FU,-5FO)
"
+ else
+ eventdat += "Cant afford to Trade Food for Fuel
!! Raid Spaceport !!"
+
+ eventdat += "Depart Spaceport
"
+
+
+//Add Random/Specific crewmember
+/obj/machinery/computer/arcade/orion_trail/proc/add_crewmember(var/specific = "")
+ var/newcrew = ""
+ if(specific)
+ newcrew = specific
+ else
if(prob(50))
- var/sfood = rand(1,10)
- var/sfuel = rand(1,10)
- food -= sfood
- fuel -= sfuel
- eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel."
- else if(prob(10))
- var/deadname = pick_n_take(settlers)
- eventdat += "
[deadname] tried to fight back but was killed."
- alive -= 1
+ newcrew = pick(first_names_male)
else
- eventdat += "
Fortunately you fended them off without any trouble."
- eventdat += "Continue
"
- eventdat += "Close
"
- else if(event == "Interstellar Flux")
- eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies."
- eventdat += "
What will you do?"
- eventdat += "Slow Down Continue
"
- eventdat += "Close
"
+ newcrew = pick(first_names_female)
+ if(newcrew)
+ settlers += newcrew
+ alive++
+ return newcrew
- else if(event == "Illness")
- eventdat += "A deadly illness has been contracted!"
- var/deadname = pick_n_take(settlers)
- eventdat += "
[deadname] was killed by the disease."
- alive -= 1
- eventdat += "Continue
"
- eventdat += "Close
"
- else if(event == "Breakdown")
- eventdat += "Oh no! The engine has broken down!"
- eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days."
- if(engine >= 1)
- eventdat += "Use PartWait
"
- else
- eventdat += "Wait
"
- eventdat += "Close
"
- else if(event == "Malfunction")
- eventdat += "The ship's systems are malfunctioning!"
- eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI."
- if(electronics >= 1)
- eventdat += "Use PartWait
"
- else
- eventdat += "Wait
"
- eventdat += "Close
"
+//Remove Random/Specific crewmember
+/obj/machinery/computer/arcade/orion_trail/proc/remove_crewmember(var/specific = "", var/dont_remove = "")
+ var/list/safe2remove = settlers
+ var/removed = ""
+ if(dont_remove)
+ safe2remove -= dont_remove
+ if(specific && specific != dont_remove)
+ safe2remove = list(specific)
+ else
+ removed = pick(safe2remove)
- else if(event == "Collision")
- eventdat += "Something hit us! Looks like there's some hull damage."
- if(prob(25))
- var/sfood = rand(5,15)
- var/sfuel = rand(5,15)
- food -= sfood
- fuel -= sfuel
- eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space."
- if(prob(10))
- var/deadname = pick_n_take(settlers)
- eventdat += "
[deadname] was killed by rapid depressurization."
- alive -= 1
- eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together."
- if(hull >= 1)
- eventdat += "Use PartWait
"
- else
- eventdat += "Wait
"
- eventdat += "Close
"
-
- else if(event == "BlackHole")
- eventdat += "You were swept away into the black hole."
- eventdat += "Oh...
"
- eventdat += "Close
"
- settlers = list()
+ if(removed)
+ if(lings_aboard && prob(40*lings_aboard)) //if there are 2 lings you're twice as likely to get one, obviously
+ lings_aboard = max(0,--lings_aboard)
+ settlers -= removed
+ alive--
+ return removed
/obj/machinery/computer/arcade/orion_trail/proc/win()
playing = 0
+ say("Congratulations, you made it to Orion!")
if(emagged)
new /obj/item/weapon/orion_ship(src.loc)
message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
@@ -688,6 +997,26 @@
newgame()
emagged = 1
+/mob/living/simple_animal/hostile/syndicate/ranged/orion
+ name = "Spaceport Security"
+ desc = "The Premier security forces for all spaceports found along the Orion Trail."
+ faction = list("orion")
+ corpse = /obj/effect/landmark/mobcorpse/orionsecurity
+
+/obj/effect/landmark/mobcorpse/orionsecurity
+ name = "Spaceport Security"
+ corpseuniform = /obj/item/clothing/under/syndicate
+ corpsesuit = /obj/item/clothing/suit/armor/vest
+ corpseshoes = /obj/item/clothing/shoes/combat
+ corpsegloves = /obj/item/clothing/gloves/combat
+ corpseradio = /obj/item/device/radio/headset
+ corpsemask = /obj/item/clothing/mask/gas
+ corpsehelmet = /obj/item/clothing/head/helmet/swat
+ corpseback = /obj/item/weapon/storage/backpack
+ corpseid = 1
+ corpseidjob = "Officer"
+ corpseidaccess = "Syndicate"
+
/obj/item/weapon/orion_ship
name = "model settler ship"
desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..."
@@ -726,4 +1055,17 @@
sleep(3.6)
src.visible_message("[src] explodes!")
explosion(src.loc, 1,2,4, flame_range = 3)
- qdel(src)
\ No newline at end of file
+ qdel(src)
+
+
+#undef ORION_TRAIL_WINTURN
+#undef ORION_TRAIL_RAIDERS
+#undef ORION_TRAIL_FLUX
+#undef ORION_TRAIL_ILLNESS
+#undef ORION_TRAIL_BREAKDOWN
+#undef ORION_TRAIL_LING
+#undef ORION_TRAIL_LING_ATTACK
+#undef ORION_TRAIL_MALFUNCTION
+#undef ORION_TRAIL_COLLISION
+#undef ORION_TRAIL_SPACEPORT
+#undef ORION_TRAIL_BLACKHOLE
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index d49f0c1cee5..4d30422e833 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -128,7 +128,7 @@
build_path = /obj/machinery/computer/arcade/battle
origin_tech = "programming=1"
/obj/item/weapon/circuitboard/arcade/orion_trail
- name = "circuit board (Orion_Trail)"
+ name = "circuit board (Orion Trail)"
build_path = /obj/machinery/computer/arcade/orion_trail
/obj/item/weapon/circuitboard/turbine_control
name = "circuit board (Turbine control)"
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 337dd01132e..6ce6246dbad 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -29,9 +29,6 @@
return 0
set_ready_state(0)
- chassis.can_move = 0
- spawn(shot_delay*projectiles_per_shot)
- chassis.can_move = 1
for(var/i=1 to get_shot_amount())
var/obj/item/projectile/A = new projectile(curloc)
A.firer = chassis.occupant
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index ce2a1fc1875..6b4660a28f0 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -9,6 +9,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
//Not on /clothing because for some reason any /obj/item can technically be "worn" with enough fuckery.
var/icon/alternate_worn_icon = null//If this is set, update_icons() will find on mob (WORN, NOT INHANDS) states in this file instead, primary use: badminnery/events
+ var/alternate_worn_layer = null//If this is set, update_icons() will force the on mob state (WORN, NOT INHANDS) onto this layer, instead of it's default
var/hitsound = null
var/throwhitsound = null
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index c32a35c5b89..866a51ea5f4 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -36,27 +36,36 @@
icon = 'icons/obj/bodybag.dmi'
icon_state = "bodybag"
var/foldedbag_path = /obj/item/bodybag
+ var/tagged = 0 // so closet code knows to put the tag overlay back
density = 0
mob_storage_capacity = 2
/obj/structure/closet/body_bag/attackby(obj/item/I, mob/user, params)
- if (istype(I, /obj/item/weapon/pen))
+ if (istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/toy/crayon))
var/t = stripped_input(user, "What would you like the label to be?", name, null, 53)
if(user.get_active_hand() != I)
return
if(!in_range(src, user) && loc != user)
return
if(t)
- name = "body bag - "
- name += t
- overlays += "bodybag_label"
+ name = "body bag - [t]"
+ tagged = 1
+ update_icon()
else
name = "body bag"
return
else if(istype(I, /obj/item/weapon/wirecutters))
- user << "You cut the tag off of [src]."
+ user << "You cut the tag off [src]."
name = "body bag"
+ tagged = 0
+ update_icon()
+
+/obj/structure/closet/body_bag/update_icon()
+ ..()
+ if (tagged)
+ overlays += "bodybag_label"
+ else
overlays.Cut()
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 1e95e040502..25bbb762e03 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -205,6 +205,7 @@
/obj/item/weapon/gun/projectile/revolver,
/obj/item/ammo_box,
)
+ alternate_worn_layer = UNDER_SUIT_LAYER
/obj/item/weapon/storage/belt/fannypack
name = "fannypack"
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 27c6aaebef1..32ad17dc3c7 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -7,8 +7,8 @@ LINEN BINS
/obj/item/weapon/bedsheet
name = "bedsheet"
desc = "A surprisingly soft linen bedsheet."
- icon = 'icons/obj/items.dmi'
- icon_state = "sheet"
+ icon = 'icons/obj/bedsheets.dmi'
+ icon_state = "white"
item_state = "bedsheet"
slot_flags = SLOT_BACK
layer = 4.0
@@ -41,129 +41,133 @@ LINEN BINS
..()
/obj/item/weapon/bedsheet/blue
- icon_state = "sheetblue"
+ icon_state = "blue"
item_color = "blue"
/obj/item/weapon/bedsheet/green
- icon_state = "sheetgreen"
+ icon_state = "green"
item_color = "green"
/obj/item/weapon/bedsheet/orange
- icon_state = "sheetorange"
+ icon_state = "orange"
item_color = "orange"
/obj/item/weapon/bedsheet/purple
- icon_state = "sheetpurple"
+ icon_state = "purple"
item_color = "purple"
/obj/item/weapon/bedsheet/patriot
name = "patriotic bedsheet"
desc = "You've never felt more free than when sleeping on this."
- icon_state = "sheetUSA"
+ icon_state = "USA"
item_color = "sheetUSA"
/obj/item/weapon/bedsheet/rainbow
name = "rainbow bedsheet"
- desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together."
- icon_state = "sheetrainbow"
+ desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together."
+ icon_state = "rainbow"
item_color = "rainbow"
/obj/item/weapon/bedsheet/red
- icon_state = "sheetred"
+ icon_state = "red"
item_color = "red"
/obj/item/weapon/bedsheet/yellow
- icon_state = "sheetyellow"
+ icon_state = "yellow"
item_color = "yellow"
/obj/item/weapon/bedsheet/mime
name = "mime's blanket"
desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this."
- icon_state = "sheetmime"
+ icon_state = "mime"
item_color = "mime"
/obj/item/weapon/bedsheet/clown
name = "clown's blanket"
- desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas."
- icon_state = "sheetclown"
+ desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas."
+ icon_state = "clown"
item_color = "clown"
/obj/item/weapon/bedsheet/captain
name = "captain's bedsheet"
desc = "It has a Nanotrasen symbol on it, and was woven with a revolutionary new kind of thread guaranteed to have 0.01% permeability for most non-chemical substances, popular among most modern captains."
- icon_state = "sheetcaptain"
+ icon_state = "captain"
item_color = "captain"
/obj/item/weapon/bedsheet/rd
name = "research director's bedsheet"
desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day."
- icon_state = "sheetrd"
+ icon_state = "rd"
item_color = "director"
/obj/item/weapon/bedsheet/medical
name = "medical blanket"
desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station."
- icon_state = "sheetmedical"
+ icon_state = "medical"
item_color = "medical"
/obj/item/weapon/bedsheet/cmo
name = "chief medical officer's bedsheet"
- desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime."
- icon_state = "sheetcmo"
+ desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime."
+ icon_state = "cmo"
item_color = "cmo"
/obj/item/weapon/bedsheet/hos
name = "head of security's bedsheet"
- desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!"
- icon_state = "sheethos"
+ desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!"
+ icon_state = "hos"
item_color = "hosred"
/obj/item/weapon/bedsheet/hop
name = "head of personnel's bedsheet"
- desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio."
- icon_state = "sheethop"
+ desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio."
+ icon_state = "hop"
item_color = "hop"
/obj/item/weapon/bedsheet/ce
name = "chief engineer's bedsheet"
- desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil."
- icon_state = "sheetce"
+ desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil."
+ icon_state = "ce"
item_color = "chief"
/obj/item/weapon/bedsheet/qm
name = "quartermaster's bedsheet"
desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper."
- icon_state = "sheetqm"
+ icon_state = "qm"
item_color = "qm"
/obj/item/weapon/bedsheet/brown
- icon_state = "sheetbrown"
+ icon_state = "brown"
item_color = "cargo"
/obj/item/weapon/bedsheet/centcom
name = "\improper Centcom bedsheet"
desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials."
- icon_state = "sheetcentcom"
+ icon_state = "centcom"
item_color = "centcom"
/obj/item/weapon/bedsheet/syndie
name = "syndicate bedsheet"
desc = "It has a syndicate emblem and it has an aura of evil."
- icon_state = "sheetsyndie"
+ icon_state = "syndie"
item_color = "syndie"
/obj/item/weapon/bedsheet/cult
name = "cultist's bedsheet"
- desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence."
- icon_state = "sheetcult"
+ desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence."
+ icon_state = "cult"
item_color = "cult"
/obj/item/weapon/bedsheet/wiz
name = "wizard's bedsheet"
- desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!"
- icon_state = "sheetwiz"
+ desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!"
+ icon_state = "wiz"
item_color = "wiz"
+/obj/item/weapon/bedsheet/ian
+ icon_state = "ian"
+ item_color = "ian"
+
/obj/structure/bedsheetbin
name = "linen bin"
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index e41fac7870f..bb209cb9515 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -46,6 +46,7 @@
overlays += "unlocked"
else
overlays += "off"
+
else
if(icon_door_override)
overlays += "[icon_door]_open"
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 8844b5c5be4..976ce7085e3 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -40,7 +40,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
switch(alert("Proc owned by something?",,"Yes","No"))
if("Yes")
targetselected = 1
- class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client")
+ if(src.holder && src.holder.marked_datum)
+ class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])")
+ if(class == "Marked datum ([holder.marked_datum.type])")
+ class = "Marked datum"
+ else
+ class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client")
switch(class)
if("Obj")
target = input("Enter target:","Target",usr) as obj in world
@@ -53,6 +58,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
for(var/client/C)
keys += C
target = input("Please, select a player!", "Selection", null, null) as null|anything in keys
+ if("Marked datum")
+ target = holder.marked_datum
else
return
if("No")
@@ -61,7 +68,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
if(!procname) return
-
+ if(targetselected && !hascall(target,procname))
+ usr << "Error: callproc(): target has no such call [procname]."
+ return
var/list/lst = get_callproc_args()
if(!lst)
return
@@ -70,9 +79,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!target)
usr << "Error: callproc(): owner of proc no longer exists."
return
- if(!hascall(target,procname))
- usr << "Error: callproc(): target has no such call [procname]."
- return
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
else
@@ -93,7 +99,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null
if(!procname)
return
-
+ if(!hascall(A,procname))
+ usr << "Error: callproc_datum(): target has no such call [procname]."
+ return
var/list/lst = get_callproc_args()
if(!lst)
return
@@ -101,9 +109,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!A || !IsValidSrc(A))
usr << "Error: callproc_datum(): owner of proc no longer exists."
return
- if(!hascall(A,procname))
- usr << "Error: callproc_datum(): target has no such call [procname]."
- return
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
spawn()
@@ -115,15 +120,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/get_callproc_args()
var/argnum = input("Number of arguments","Number:",0) as num|null
if(!argnum && (argnum!=0)) return
-
+
var/list/lst = list()
//TODO: make a list to store whether each argument was initialised as null.
//Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists
//this will protect us from a fair few errors ~Carn
while(argnum--)
+ var/class = null
// Make a list with each index containing one variable, to be given to the proc
- var/class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL")
+ if(src.holder && src.holder.marked_datum)
+ class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","Marked datum ([holder.marked_datum.type])","CANCEL")
+ if(holder.marked_datum && class == "Marked datum ([holder.marked_datum.type])")
+ class = "Marked datum"
+ else
+ class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL")
switch(class)
if("CANCEL")
return null
@@ -158,6 +169,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("mob's area")
var/mob/temp = input("Select mob", "Selection", usr) as mob in world
lst += temp.loc
+ if("Marked datum")
+ lst += holder.marked_datum
return lst
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index ec1fd6b67fb..1303a8ee03b 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -9,11 +9,6 @@
origin_tech = "biotech=3"
var/braintype = "Cyborg"
- req_access = list(access_robotics)
-
- //Revised. Brainmob is now contained directly within object of transfer. MMI in this case.
-
- var/locked = 0
var/syndiemmi = 0 //Whether or not this is a Syndicate MMI
var/mob/living/carbon/brain/brainmob = null //The current occupant.
var/mob/living/silicon/robot = null //Appears unused.
@@ -63,19 +58,10 @@
name = "Man-Machine Interface: [brainmob.real_name]"
update_icon()
- locked = 1
-
feedback_inc("cyborg_mmis_filled",1)
return
- if((istype(O,/obj/item/weapon/card/id)||istype(O,/obj/item/device/pda)) && brainmob)
- if(allowed(user))
- locked = !locked
- user << "You [locked ? "lock" : "unlock"] the brain holder."
- else
- user << "Access denied."
- return
if(brainmob)
O.attack(brainmob, user) //Oh noooeeeee
return
@@ -84,10 +70,8 @@
/obj/item/device/mmi/attack_self(mob/user)
if(!brain)
user << "You upend the MMI, but there's nothing in it!"
- else if(locked)
- user << "You upend the MMI, but the brain is clamped into place!"
else
- user << "You upend the MMI, spilling the brain onto the floor."
+ user << "You unlock and upend the MMI, spilling the brain onto the floor."
brainmob.container = null //Reset brainmob mmi var.
brainmob.loc = brain //Throw mob into brain.
@@ -116,7 +100,6 @@
name = "Man-Machine Interface: [brainmob.real_name]"
update_icon()
- locked = 1
return
/obj/item/device/mmi/radio_enabled
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 79817af275c..7f8445b95fc 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -11,7 +11,6 @@ var/global/posibrain_notif_cooldown = 0
var/askDelay = 10 * 60 * 1
brainmob = null
req_access = list(access_robotics)
- locked = 0
mecha = null//This does not appear to be used outside of reference in mecha.dm.
braintype = "Android"
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 362a423eb50..8f8f5829970 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -212,13 +212,18 @@ Please contact me on #coderbus IRC. ~Carnie x
var/image/standing
var/iconfile2use //Which icon file to use to generate the overlay and any female alterations.
+ var/layer2use
if(U.alternate_worn_icon)
iconfile2use = U.alternate_worn_icon
if(!iconfile2use)
iconfile2use = 'icons/mob/uniform.dmi'
+ if(U.alternate_worn_layer)
+ layer2use = U.alternate_worn_layer
+ if(!layer2use)
+ layer2use = UNIFORM_LAYER
- standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER)
+ standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-layer2use)
overlays_standing[UNIFORM_LAYER] = standing
@@ -266,11 +271,17 @@ Please contact me on #coderbus IRC. ~Carnie x
var/t_state = gloves.item_state
if(!t_state) t_state = gloves.icon_state
+ var/layer2use
+ if(gloves.alternate_worn_layer)
+ layer2use = gloves.alternate_worn_layer
+ if(!layer2use)
+ layer2use = GLOVES_LAYER
+
var/image/standing
if(gloves.alternate_worn_icon)
- standing = image("icon"=gloves.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-GLOVES_LAYER)
+ standing = image("icon"=gloves.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/hands.dmi', "icon_state"="[t_state]", "layer"=-GLOVES_LAYER)
+ standing = image("icon"='icons/mob/hands.dmi', "icon_state"="[t_state]", "layer"=-layer2use)
overlays_standing[GLOVES_LAYER] = standing
@@ -294,11 +305,17 @@ Please contact me on #coderbus IRC. ~Carnie x
glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
client.screen += glasses //Either way, add the item to the HUD
+ var/layer2use
+ if(glasses.alternate_worn_layer)
+ layer2use = glasses.alternate_worn_layer
+ if(!layer2use)
+ layer2use = GLASSES_LAYER
+
var/image/standing
if(glasses.alternate_worn_icon)
- standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-GLASSES_LAYER)
+ standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-GLASSES_LAYER)
+ standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-layer2use)
overlays_standing[GLASSES_LAYER] = standing
@@ -314,11 +331,17 @@ Please contact me on #coderbus IRC. ~Carnie x
ears.screen_loc = ui_ears //...draw the item in the inventory screen
client.screen += ears //Either way, add the item to the HUD
+ var/layer2use
+ if(ears.alternate_worn_layer)
+ layer2use = ears.alternate_worn_layer
+ if(!layer2use)
+ layer2use = EARS_LAYER
+
var/image/standing
if(ears.alternate_worn_icon)
- standing = image("icon"=ears.alternate_worn_icon, "icon_state"="[ears.icon_state]", "layer"=-EARS_LAYER)
+ standing = image("icon"=ears.alternate_worn_icon, "icon_state"="[ears.icon_state]", "layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/ears.dmi', "icon_state"="[ears.icon_state]", "layer"=-EARS_LAYER)
+ standing = image("icon"='icons/mob/ears.dmi', "icon_state"="[ears.icon_state]", "layer"=-layer2use)
overlays_standing[EARS_LAYER] = standing
@@ -334,11 +357,17 @@ Please contact me on #coderbus IRC. ~Carnie x
shoes.screen_loc = ui_shoes //...draw the item in the inventory screen
client.screen += shoes //Either way, add the item to the HUD
+ var/layer2use
+ if(shoes.alternate_worn_layer)
+ layer2use = shoes.alternate_worn_layer
+ if(!layer2use)
+ layer2use = SHOES_LAYER
+
var/image/standing
if(shoes.alternate_worn_icon)
- standing = image("icon"=shoes.alternate_worn_icon, "icon_state"="[shoes.icon_state]","layer"=-SHOES_LAYER)
+ standing = image("icon"=shoes.alternate_worn_icon, "icon_state"="[shoes.icon_state]","layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/feet.dmi', "icon_state"="[shoes.icon_state]", "layer"=-SHOES_LAYER)
+ standing = image("icon"='icons/mob/feet.dmi', "icon_state"="[shoes.icon_state]", "layer"=-layer2use)
overlays_standing[SHOES_LAYER] = standing
if(shoes.blood_DNA)
@@ -384,11 +413,17 @@ Please contact me on #coderbus IRC. ~Carnie x
var/t_state = belt.item_state
if(!t_state) t_state = belt.icon_state
+ var/layer2use
+ if(belt.alternate_worn_layer)
+ layer2use = belt.alternate_worn_layer
+ if(!layer2use)
+ layer2use = BELT_LAYER
+
var/image/standing
if(belt.alternate_worn_icon)
- standing = image("icon"=belt.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-BELT_LAYER)
+ standing = image("icon"=belt.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/belt.dmi', "icon_state"="[t_state]", "layer"=-BELT_LAYER)
+ standing = image("icon"='icons/mob/belt.dmi', "icon_state"="[t_state]", "layer"=-layer2use)
overlays_standing[BELT_LAYER] = standing
@@ -405,11 +440,18 @@ Please contact me on #coderbus IRC. ~Carnie x
wear_suit.screen_loc = ui_oclothing //TODO //...draw the item in the inventory screen
client.screen += wear_suit //Either way, add the item to the HUD
+
+ var/layer2use
+ if(wear_suit.alternate_worn_layer)
+ layer2use = wear_suit.alternate_worn_layer
+ if(!layer2use)
+ layer2use = SUIT_LAYER
+
var/image/standing
if(wear_suit.alternate_worn_icon)
- standing = image("icon"=wear_suit.alternate_worn_icon, "icon_state"="[wear_suit.icon_state]", "layer"=-SUIT_LAYER)
+ standing = image("icon"=wear_suit.alternate_worn_icon, "icon_state"="[wear_suit.icon_state]", "layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/suit.dmi', "icon_state"="[wear_suit.icon_state]", "layer"=-SUIT_LAYER)
+ standing = image("icon"='icons/mob/suit.dmi', "icon_state"="[wear_suit.icon_state]", "layer"=-layer2use)
overlays_standing[SUIT_LAYER] = standing
if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 163ccdae8b1..b8129dd15c9 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -96,11 +96,18 @@
/mob/living/carbon/update_inv_wear_mask()
remove_overlay(FACEMASK_LAYER)
if(istype(wear_mask, /obj/item/clothing/mask))
+
+ var/layer2use
+ if(wear_mask.alternate_worn_layer)
+ layer2use = wear_mask.alternate_worn_layer
+ if(!layer2use)
+ layer2use = FACEMASK_LAYER
+
var/image/standing
if(wear_mask.alternate_worn_icon)
- standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER)
+ standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER)
+ standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
overlays_standing[FACEMASK_LAYER] = standing
@@ -111,11 +118,18 @@
/mob/living/carbon/update_inv_back()
remove_overlay(BACK_LAYER)
if(back)
+
+ var/layer2use
+ if(back.alternate_worn_layer)
+ layer2use = back.alternate_worn_layer
+ if(!layer2use)
+ layer2use = BACK_LAYER
+
var/image/standing
if(back.alternate_worn_icon)
- standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER)
+ standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER)
+ standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-layer2use)
overlays_standing[BACK_LAYER] = standing
return back
@@ -124,11 +138,18 @@
/mob/living/carbon/update_inv_head()
remove_overlay(HEAD_LAYER)
if(head)
+
+ var/layer2use
+ if(head.alternate_worn_layer)
+ layer2use = head.alternate_worn_layer
+ if(!layer2use)
+ layer2use = HEAD_LAYER
+
var/image/standing
if(head.alternate_worn_icon)
- standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER)
+ standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-layer2use)
if(!standing)
- standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER)
+ standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-layer2use)
standing.color = head.color // For now, this is here solely for kitty ears, but everything should do this eventually
standing.alpha = head.alpha
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e37ec22d115..e978c6c37a6 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -108,7 +108,6 @@
mmi = new(src)
mmi.brain = new /obj/item/organ/brain(mmi)
mmi.brain.name = "[real_name]'s brain"
- mmi.locked = 1
mmi.icon_state = "mmi_full"
mmi.name = "Man-Machine Interface: [real_name]"
mmi.brainmob = new(src)
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 580a7172ba3..b102ef80167 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -32,7 +32,6 @@
var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!"
var/bio_fluff_string = "Your scarabs fail to mutate. This shouldn't happen! Submit a bug report!"
-
/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies
..()
if(summoner)
@@ -118,6 +117,7 @@
for(var/mob/M in mob_list)
if(M == src.summoner)
M << "[src]: [input]"
+ src << "[src]: [input]"
/mob/living/proc/guardian_comm()
set name = "Communicate"
@@ -128,7 +128,7 @@
for(var/mob/living/simple_animal/hostile/guardian/M in mob_list)
if(M.summoner == src)
M << "[src]: [input]"
-
+ src << "[src]: [input]"
//////////////////////////TYPES OF GUARDIANS
@@ -138,11 +138,11 @@
/mob/living/simple_animal/hostile/guardian/fire
a_intent = "help"
- melee_damage_lower = 15
- melee_damage_upper = 15
+ melee_damage_lower = 10
+ melee_damage_upper = 10
attack_sound = 'sound/items/Welder.ogg'
attacktext = "sears"
- damage_transfer = 0.6
+ damage_transfer = 0.7
range = 10
playstyle_string = "As a fire type, you have only light damage resistance, but will ignite any enemy you bump into."
environment_smash = 1
@@ -155,7 +155,7 @@
if(istype(AM, /mob/living/))
var/mob/living/M = AM
if(AM != src.summoner)
- M.adjust_fire_stacks(20)
+ M.adjust_fire_stacks(10)
M.IgniteMob()
//Standard
@@ -163,7 +163,7 @@
/mob/living/simple_animal/hostile/guardian/punch
melee_damage_lower = 25
melee_damage_upper = 25
- damage_transfer = 0.4
+ damage_transfer = 0.5
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
environment_smash = 2
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
@@ -183,26 +183,23 @@
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
..()
- src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]\
- [src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]")
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
- playsound(loc, src.attack_sound, 50, 1, 1)
+ if(istype(target, /mob/living))
+ src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]\
+ [src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]")
+ playsound(loc, src.attack_sound, 50, 1, 1)
+ playsound(loc, src.attack_sound, 50, 1, 1)
+ playsound(loc, src.attack_sound, 50, 1, 1)
+ playsound(loc, src.attack_sound, 50, 1, 1)
+
//Fast Standard. Does less damage, has less resistance, but moves faster, has higher range
/mob/living/simple_animal/hostile/guardian/fast
- melee_damage_lower = 25
- melee_damage_upper = 25
- damage_transfer = 0.6
+ melee_damage_lower = 20
+ melee_damage_upper = 20
+ damage_transfer = 0.7
speed = -1
range = 15
attacktext = "slices"
@@ -247,6 +244,7 @@
/mob/living/simple_animal/hostile/guardian/healer
a_intent = "help"
friendly = "heals"
+ speed = 1
melee_damage_lower = 0
melee_damage_upper = 0
playstyle_string = "As a healer type, you are incapable of attacking, but can mend any wound simply by touching a target."
@@ -256,6 +254,9 @@
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
..()
+ if(src.loc == summoner)
+ src << "You must be manifested to heal!"
+ return
if(iscarbon(target))
var/mob/living/carbon/C = target
C.adjustBruteLoss(-5)
@@ -263,21 +264,26 @@
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
+/obj/item/projectile/guardian
+ name = "crystal spray"
+ icon_state = "guardian"
+ damage = 4
+ damage_type = BRUTE
+
/mob/living/simple_animal/hostile/guardian/ranged
a_intent = "help"
melee_damage_lower = 10
melee_damage_upper = 10
damage_transfer = 1.2
- projectiletype = /obj/item/projectile/neurotox
- ranged_cooldown_cap = 1
- projectilesound = 'sound/weapons/pierce.ogg'
+ projectiletype = /obj/item/projectile/guardian
+ ranged_cooldown_cap = 0
+ projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = 1
- rapid = 1
range = 13
- playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying neurotoxin."
+ playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed."
magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat."
tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Nanoswarm online."
- bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spitting neurotoxin."
+ bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal."
/mob/living/simple_animal/hostile/guardian/bluespace
@@ -313,6 +319,9 @@
var/bomb_cooldown = 0
/mob/living/simple_animal/hostile/guardian/bomb/ShiftClickOn(atom/movable/A)
+ if(src.loc == summoner)
+ src << "You must be manifested to create bombs!"
+ return
if(istype(A, /obj/))
if(bomb_cooldown <= world.time && !stat)
var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A))
@@ -334,6 +343,8 @@
/obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A)
A.loc = src
stored_obj = A
+ anchored = A.anchored
+ density = A.density
appearance = A.appearance
spawn(600)
stored_obj.loc = get_turf(src.loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index c51fc8e17b1..1f24ed85e1c 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -35,6 +35,8 @@
/mob/living/simple_animal/hostile/Life()
. = ..()
+ if(ranged)
+ ranged_cooldown--
if(!.) //dead
walk(src, 0) //stops walking
return 0
@@ -42,8 +44,6 @@
/mob/living/simple_animal/hostile/handle_automated_action()
if(AIStatus == AI_OFF)
return 0
- if(ranged)
- ranged_cooldown--
var/list/possible_targets = ListTargets() //we look around for potential targets and make it a list for later use.
if(environment_smash)
@@ -315,4 +315,4 @@
. = 0
/mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets)
- return !FindTarget(possible_targets, 1)
\ No newline at end of file
+ return !FindTarget(possible_targets, 1)
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 0a89745dfcf..ef0d35fb175 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -122,12 +122,12 @@
projectile_type = /obj/item/projectile/plasma
select_name = "plasma burst"
fire_sound = 'sound/weapons/Laser.ogg'
- delay = 10
+ delay = 15
e_cost = 25
/obj/item/ammo_casing/energy/plasma/adv
projectile_type = /obj/item/projectile/plasma/adv
- delay = 8
+ delay = 10
e_cost = 10
/obj/item/ammo_casing/energy/wormhole
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
index a90eda4508f..2833f2de7f5 100644
--- a/code/modules/projectiles/firing.dm
+++ b/code/modules/projectiles/firing.dm
@@ -31,8 +31,9 @@
var/turf/curloc = user.loc
if (!istype(targloc) || !istype(curloc) || !BB)
return 0
- if(targloc == curloc) //Fire the projectile
- user.bullet_act(BB)
+ if(targloc == curloc)
+ if(BB.original == user) //if we target ourselves we go straight to bullet_act()
+ user.bullet_act(BB)
del(BB)
return 1
BB.loc = get_turf(user)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 4ff0cfff93c..dc411940f0d 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -94,9 +94,10 @@
/obj/item/projectile/Bump(atom/A, yes)
if(!yes) //prevents double bumps.
return
- if(A == firer || A == src)
- loc = A.loc
- return 0 //cannot shoot yourself
+ if(firer)
+ if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech
+ loc = A.loc
+ return 0
var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
@@ -134,7 +135,7 @@
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
step_towards(src, current)
- if((original && original.layer>=2.75) || ismob(original))
+ if(original && (original.layer>=2.75) || ismob(original))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original, 1)
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 1e0034644f4..87f2acf69c3 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -204,29 +204,31 @@ obj/item/projectile/kinetic/New()
icon_state = "plasmacutter"
damage_type = BRUTE
damage = 5
- range = 1
+ range = 3
/obj/item/projectile/plasma/New()
var/turf/proj_turf = get_turf(src)
if(!istype(proj_turf, /turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure < 30)
- name = "full strength plasma blast"
- damage *= 3
- range += 3
+ if(environment)
+ var/pressure = environment.return_pressure()
+ if(pressure < 30)
+ name = "full strength plasma blast"
+ damage *= 3
..()
/obj/item/projectile/plasma/on_hit(atom/target)
+ . = ..()
if(istype(target, /turf/simulated/mineral))
var/turf/simulated/mineral/M = target
M.gets_drilled(firer)
- return ..()
+ range = max(range - 1, 1)
+ return -1
/obj/item/projectile/plasma/adv
- range = 2
+ range = 5
/obj/item/projectile/plasma/adv/mech
damage = 10
- range = 3
+ range = 6
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
index 8c4de4c0cd5..edfd038e960 100644
--- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
@@ -544,7 +544,7 @@
if(volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
- reagentdecal.reagents.add_reagent("uranium", volume)
+ reagentdecal.reagents.add_reagent("radium", volume)
/datum/reagent/sterilizine
name = "Sterilizine"
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 8ca566a7661..0f657da38b0 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -210,7 +210,7 @@
build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
category = list("Computer Boards")
-/datum/design/orion_trail
+/datum/design/slot_machine
name = "Computer Design (Slot Machine)"
desc = "Allows for the construction of circuit boards used to build a new slot machine."
id = "slotmachine"
@@ -378,4 +378,4 @@
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/libraryconsole
- category = list("Computer Boards")
\ No newline at end of file
+ category = list("Computer Boards")
diff --git a/html/changelog.html b/html/changelog.html
index b7c88dc2e93..3ce048bd829 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,51 @@
-->
+
07 August 2015
+
KorPhaeron updated:
+
+ - Added a new Guardian Mob that can be summoned to manifest inside a mob.
+ - Guardians can communicate with their host and materialize themselves to protect their host with magic powers.
+ - Guardians are invincible but cannot live without or too far from their host, they also relay injuries they suffer to the host.
+
+
Phil235 updated:
+
+ - Fixed being able to run into your own bullet.
+
+
RemieRichards updated:
+
+ - You no longer need to click on an item in a storage container to remove it, clicking anywhere around the item works.
+
+
bustygoku updated:
+
+ - Removed the chance for a disease to make you a carrier on transfer.
+
+
phil235 updated:
+
+ - The plasma cutter's fire rate is now a bit lower but its projectile can pierce multiple asteroid walls and its range isn't lowered in pressurized environment anymore.
+
+
+
06 August 2015
+
AnturK updated:
+
+ - Adds the voodoo doll as a mining treasure, link it with a victim with an item previously held by them.
+ - Once linked the voodoo doll can be used to injure, confuse and control the victim.
+
+
Core0verlad updated:
+
+ - Items can now be removed from storage containers inside storage containers.
+ - Beds and bedsheets have new sprites.
+ - MMIs are no longer ID locked.
+
+
KorPhaeron updated:
+
+ - Slaughter Demon's have had their health reduced to 200 and their speed reduced but they get a speed boost when exiting blood.
+
+
MrPerson updated:
+
+ - Items stacks now automatically merge unless thrown when moved onto the same tile.
+
+
05 August 2015
CoreOverload updated:
LordPidey updated:
- - Added a new chemical. Spray tan. It is made by mixing orange juice with oil or corn oil. Warning: overexposure may result in orange douchebaggery.
+ - Added a new chemical. Spray tan. It is made by mixing orange juice with oil or corn oil. Warning: overexposure may result in orange douchebaggery.
Xhuis updated:
@@ -112,7 +157,7 @@
Steelpoint updated:
- Fixed multiple mapping errors for Boxstation and the mining base.
- - A circuit imprinter and exosuit fabrication board have been added to tech storage.
+ - A circuit imprinter and exosuit fabrication board have been added to tech storage.
SvartaSvansen updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index d7d1d28a246..30c91c7ebd4 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1429,7 +1429,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Syndicate toolboxes now come with never before seen red insulated gloves.
Steelpoint:
- bugfix: Fixed multiple mapping errors for Boxstation and the mining base.
- - resadd: A circuit imprinter and exosuit fabrication board have been added to tech
+ - rscadd: A circuit imprinter and exosuit fabrication board have been added to tech
storage.
SvartaSvansen:
- rscadd: Our lizard engineers have worked hard and managed to improve Centcom airlocks
@@ -1464,8 +1464,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Ikarrus:
- rscdel: Head beatings no longer deconvert gangsters.
LordPidey:
- - rscadd: 'Added a new chemical. Spray tan. It is made by mixing orange juice
- with oil or corn oil. Warning: overexposure may result in orange douchebaggery.'
+ - rscadd: 'Added a new chemical. Spray tan. It is made by mixing orange juice with
+ oil or corn oil. Warning: overexposure may result in orange douchebaggery.'
Xhuis:
- rscadd: Shadowling thralls can now be deconverted via surgery or borging.
- rscadd: Thralls can be revealed by examining them. They can hide this by wearing
@@ -1484,3 +1484,37 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
bgobandit:
- rscadd: Nanotrasen scientists have achieved the tremendous breakthrough of injecting
gold slime extracts with water. Pets ensued.
+2015-08-06:
+ AnturK:
+ - rscadd: Adds the voodoo doll as a mining treasure, link it with a victim with
+ an item previously held by them.
+ - rscadd: Once linked the voodoo doll can be used to injure, confuse and control
+ the victim.
+ Core0verlad:
+ - tweak: Items can now be removed from storage containers inside storage containers.
+ - imageadd: Beds and bedsheets have new sprites.
+ - rscdel: MMIs are no longer ID locked.
+ KorPhaeron:
+ - tweak: Slaughter Demon's have had their health reduced to 200 and their speed
+ reduced but they get a speed boost when exiting blood.
+ MrPerson:
+ - rscadd: Items stacks now automatically merge unless thrown when moved onto the
+ same tile.
+2015-08-07:
+ KorPhaeron:
+ - rscadd: Added a new Guardian Mob that can be summoned to manifest inside a mob.
+ - rscadd: Guardians can communicate with their host and materialize themselves to
+ protect their host with magic powers.
+ - rscadd: Guardians are invincible but cannot live without or too far from their
+ host, they also relay injuries they suffer to the host.
+ Phil235:
+ - bugfix: Fixed being able to run into your own bullet.
+ RemieRichards:
+ - rscadd: You no longer need to click on an item in a storage container to remove
+ it, clicking anywhere around the item works.
+ bustygoku:
+ - rscdel: Removed the chance for a disease to make you a carrier on transfer.
+ phil235:
+ - tweak: The plasma cutter's fire rate is now a bit lower but its projectile can
+ pierce multiple asteroid walls and its range isn't lowered in pressurized environment
+ anymore.
diff --git a/html/changelogs/RemieRichards-OrionTrailUpdate.yml b/html/changelogs/RemieRichards-OrionTrailUpdate.yml
new file mode 100644
index 00000000000..a7c752dd90a
--- /dev/null
+++ b/html/changelogs/RemieRichards-OrionTrailUpdate.yml
@@ -0,0 +1,10 @@
+
+author: RemieRichards
+
+delete-after: True
+
+changes:
+ - rscadd: "Nanotrasen Mandatory FunCo Subsidiary: CoderbusGames, would like to announce an update to Orion Trail!"
+ - rscadd: "Spaceports: Buy/Sell Crew, Trade Fuel for Food, Trade Food for Fuel, Buy Spare Electronics, Engine Parts and Hull Plates, or maybe you think you're tough enough to attack the spaceport?"
+ - rscadd: "Changelings: Changelings can now sneak into your crew, Changelings eat double the standard food ration and have a chance to Ambush the rest of the crew!"
+ - rscadd: "Kill Crewmembers: Do you suspect changelings? or dont feel you have enough food rations? Just shoot somebody in the head, at any time!"
diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi
new file mode 100644
index 00000000000..a91c635f502
Binary files /dev/null and b/icons/obj/bedsheets.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 79e9c0ef2ad..f4c5ae1d242 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/nuke_tools.dmi b/icons/obj/nuke_tools.dmi
index 4b604712a71..f052b552e13 100644
Binary files a/icons/obj/nuke_tools.dmi and b/icons/obj/nuke_tools.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 94ccf0c8d2f..bc58bdbc837 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index cc0325cdfae..72ef46c7163 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ