diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm
index 7be419b705c..3303fda93a3 100644
--- a/code/datums/organs/organ_external.dm
+++ b/code/datums/organs/organ_external.dm
@@ -307,8 +307,8 @@
var/obj/item/weapon/organ/H
switch(body_part)
- if(UPPER_TORSO)
- owner.gib()
+ // if(UPPER_TORSO) just no.
+ // owner.gib()
if(LOWER_TORSO)
owner << "\red You are now sterile."
if(HEAD)
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 2c0cd9da7b9..4fa8f095fe0 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -820,14 +820,14 @@ Auto Patrol: []"},
projectile = /obj/item/projectile/energy/electrode
else if(lasercolor == "b")
if (src.emagged == 2)
- projectile = /obj/item/projectile/omnitag
+ projectile = /obj/item/projectile/beam/omnitag
else
- projectile = /obj/item/projectile/bluetag
+ projectile = /obj/item/projectile/beam/bluetag
else if(lasercolor == "r")
if (src.emagged == 2)
- projectile = /obj/item/projectile/omnitag
+ projectile = /obj/item/projectile/beam/omnitag
else
- projectile = /obj/item/projectile/redtag
+ projectile = /obj/item/projectile/beam/redtag
if (!( istype(U, /turf) ))
return
@@ -1011,7 +1011,7 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj)
if((src.lasercolor == "b") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/redtag))
+ if(istype(Proj, /obj/item/projectile/beam/redtag))
src.disabled = 1
del (Proj)
sleep(100)
@@ -1019,7 +1019,7 @@ Auto Patrol: []"},
else
..()
else if((src.lasercolor == "r") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/bluetag))
+ if(istype(Proj, /obj/item/projectile/beam/bluetag))
src.disabled = 1
del (Proj)
sleep(100)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 1d7fccfc403..17c5ebcbb0c 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -27,6 +27,7 @@
var/const/STATE_STATUSDISPLAY = 7
var/const/STATE_ALERT_LEVEL = 8
var/const/STATE_CONFIRM_LEVEL = 9
+ var/const/STATE_CREWTRANSFER = 10
var/status_display_freq = "1435"
var/stat_msg1
@@ -121,6 +122,15 @@
if(emergency_shuttle.online)
post_status("shuttle")
src.state = STATE_DEFAULT
+ if("crewtransfer")
+ src.state= STATE_DEFAULT
+ if(src.authenticated)
+ src.state = STATE_CREWTRANSFER
+ if("crewtransfer2")
+ if(src.authenticated)
+ init_shift_change(usr) //key difference here
+ if(emergency_shuttle.online)
+ post_status("shuttle")
if("cancelshuttle")
src.state = STATE_DEFAULT
if(src.authenticated)
@@ -313,6 +323,7 @@
dat += "
\[ Cancel Shuttle Call \]"
else
dat += "
\[ Call Emergency Shuttle \]"
+ dat += "
\[ Initiate Crew Transfer \]"
dat += "
\[ Set Status Display \]"
else
@@ -320,6 +331,8 @@
dat += "
\[ Message List \]"
if(STATE_CALLSHUTTLE)
dat += "Are you sure you want to call the shuttle? \[ OK | Cancel \]"
+ if(STATE_CREWTRANSFER) // this is the shiftchage screen.
+ dat += "Are you sure you want to initiate a crew transfer? This will call the shuttle. \[ OK | Cancel \]"
if(STATE_CANCELSHUTTLE)
dat += "Are you sure you want to cancel the shuttle? \[ OK | Cancel \]"
if(STATE_MESSAGELIST)
@@ -458,6 +471,47 @@
return
+/proc/init_shift_change(var/mob/user, var/force = 0)
+ if ((!( ticker ) || emergency_shuttle.location))
+ return
+
+ if(emergency_shuttle.direction == -1)
+ user << "The shuttle may not be called while returning to CentCom."
+ return
+
+ if(emergency_shuttle.online)
+ user << "The shuttle is already on its way."
+ return
+
+ // if force is 0, some things may stop the shuttle call
+ if(!force)
+ if(emergency_shuttle.deny_shuttle)
+ user << "Centcom does not currently have a shuttle available in your sector. Please try again later."
+ return
+
+ if(sent_strike_team == 1)
+ user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated."
+ return
+
+ if(world.time < 54000) // 30 minute grace period to let the game get going
+ user << "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again."//may need to change "/600"
+ return
+
+ if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "sandbox")
+ //New version pretends to call the shuttle but cause the shuttle to return after a random duration.
+ emergency_shuttle.fake_recall = rand(300,500)
+
+ if(ticker.mode.name == "blob" || ticker.mode.name == "epidemic")
+ user << "Under directive 7-10, [station_name()] is quarantined until further notice."
+ return
+
+ emergency_shuttle.shuttlealert(1)
+ emergency_shuttle.incall()
+ log_game("[key_name(user)] has called the shuttle.")
+ message_admins("[key_name_admin(user)] has called the shuttle.", 1)
+ captain_announce("A crew transfer has been initiated. The shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
+
+ return
/proc/cancel_call_proc(var/mob/user)
if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0 || emergency_shuttle.timeleft() < 300))
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 77e5c7763c9..7be13d3d1e3 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -76,8 +76,8 @@
// All energy-based weapons are applicable
switch(E.type)
if(/obj/item/weapon/gun/energy/laser/bluetag)
- projectile = /obj/item/projectile/bluetag
- eprojectile = /obj/item/projectile/omnitag//This bolt will stun ERRYONE with a vest
+ projectile = /obj/item/projectile/beam/bluetag
+ eprojectile = /obj/item/projectile/beam/omnitag//This bolt will stun ERRYONE with a vest
iconholder = null
reqpower = 100
lasercolor = "b"
@@ -90,8 +90,8 @@
shot_delay = 30
if(/obj/item/weapon/gun/energy/laser/redtag)
- projectile = /obj/item/projectile/redtag
- eprojectile = /obj/item/projectile/omnitag
+ projectile = /obj/item/projectile/beam/redtag
+ eprojectile = /obj/item/projectile/beam/omnitag
iconholder = null
reqpower = 100
lasercolor = "r"
@@ -104,7 +104,7 @@
shot_delay = 30
if(/obj/item/weapon/gun/energy/laser/practice)
- projectile = /obj/item/projectile/practice
+ projectile = /obj/item/projectile/beam/practice
eprojectile = /obj/item/projectile/beam
iconholder = null
reqpower = 100
@@ -375,13 +375,13 @@ Status: []
"},
if (src.health <= 0)
src.die() // the death process :(
if((src.lasercolor == "b") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/redtag))
+ if(istype(Proj, /obj/item/projectile/beam/redtag))
src.disabled = 1
del (Proj)
sleep(100)
src.disabled = 0
if((src.lasercolor == "r") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/bluetag))
+ if(istype(Proj, /obj/item/projectile/beam/bluetag))
src.disabled = 1
del (Proj)
sleep(100)
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index 2bf3020782c..990b823ef15 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -221,9 +221,9 @@
if(4)
A = new /obj/item/projectile/change( loc )
if(5)
- A = new /obj/item/projectile/bluetag( loc )
+ A = new /obj/item/projectile/beam/bluetag( loc )
if(6)
- A = new /obj/item/projectile/redtag( loc )
+ A = new /obj/item/projectile/beam/redtag( loc )
A.original = target.loc
use_power(500)
else
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 94310b70fb9..dce87fda314 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -114,7 +114,7 @@
bmark.pixel_x--
bmark.pixel_y--
- if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/practice))
+ if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice))
bmark.icon_state = "scorch"
bmark.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index bc403b705be..95f1c5435a4 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -93,7 +93,9 @@
"/obj/item/weapon/cigpacket",
"/obj/item/weapon/storage/pill_bottle",
"/obj/item/stack/medical",
- "/obj/item/device/flashlight/pen"
+ "/obj/item/device/flashlight/pen",
+ "/obj/item/clothing/mask/surgical",
+ "/obj/item/clothing/gloves/latex"
)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 59edfd3ebb0..0fbebfdcbee 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -554,4 +554,8 @@
..()
return
+/obj/item/weapon/storage/pill_bottle/New()
+ pixel_x = rand (-7,7)
+ pixel_y = rand (-7,7)
+ ..()
////////////////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index b22685860d3..b71b60532f4 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -99,12 +99,12 @@
H.apply_effect(10, STUTTER, 0)
charges--
- H.visible_message("[src] hits [H] with stunning end!")
- H.attack_log += "\[[time_stamp()]\] Stunned by thrown [src.name]"
- log_attack("Flying [src.name] stunned [H.name] ([H.ckey])" )
+ H.visible_message("[src], thrown by ([src.fingerprintslast]) hits [H] with stunning end!")
+ H.attack_log += "\[[time_stamp()]\] Stunned by thrown [src.name] (([src.fingerprintslast]))"
+ log_attack("Flying [src.name], thrown by ([src.fingerprintslast]) stunned [H.name] ([H.ckey])" )
- log_admin("ATTACK: Flying [src.name] stunned [H.name] ([H.ckey])")
- msg_admin_attack("ATTACK: Flying [src.name] stunned [H.name] ([H.ckey])") //BS12 EDIT ALG
+ log_admin("ATTACK: Flying [src.name], thrown by ([src.fingerprintslast]) stunned [H.name] ([H.ckey])")
+ msg_admin_attack("ATTACK: Flying [src.name], thrown by ([src.fingerprintslast]) stunned [H.name] ([H.ckey]).") //BS12 EDIT ALG
return
return ..()
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 2f6cb028f54..bcb67e292e2 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -90,7 +90,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "bluetag"
desc = "Standard issue weapon of the Imperial Guard"
- projectile_type = "/obj/item/projectile/bluetag"
+ projectile_type = "/obj/item/projectile/beam/bluetag"
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
@@ -127,7 +127,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "redtag"
desc = "Standard issue weapon of the Imperial Guard"
- projectile_type = "/obj/item/projectile/redtag"
+ projectile_type = "/obj/item/projectile/beam/redtag"
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index e61af3b9cdf..8f2d39bf9de 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -1,14 +1,80 @@
+var/list/beam_master = list()
+//Use: Caches beam state images and holds turfs that had these images overlaid.
+//Structure:
+//beam_master
+// icon_states/dirs of beams
+// image for that beam
+// references for fired beams
+// icon_states/dirs for each placed beam image
+// turfs that have that icon_state/dir
+
/obj/item/projectile/beam
name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
- damage = 20
+ damage = 40
damage_type = BURN
flag = "laser"
- eyeblur = 2
+ eyeblur = 4
var/frequency = 1
+ process()
+ var/reference = "\ref[src]" //So we do not have to recalculate it a ton
+ var/first = 1 //So we don't make the overlay in the same tile as the firer
-/obj/item/projectile/practice
+ spawn(0)
+ while(!bumped) //Move until we hit something
+ step_towards(src, current) //Move~
+
+ for(var/mob/living/M in loc)
+ Bump(M) //Bump anyone we touch
+
+ if((!( current ) || loc == current)) //If we pass our target
+ current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
+
+ if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
+ del(src) //Delete if it passes the world edge
+ return
+
+ if(!first) //Add the overlay as we pass over tiles
+ var/target_dir = get_dir(src, current) //So we don't call this too much
+
+ //If the icon has not been added yet
+ if( !("[icon_state][target_dir]" in beam_master) )
+ var/image/I = image(icon,icon_state,10,target_dir) //Generate it.
+ beam_master["[icon_state][target_dir]"] = I //And cache it!
+
+ //Finally add the overlay
+ src.loc.overlays += beam_master["[icon_state][target_dir]"]
+
+ //Add the turf to a list in the beam master so they can be cleaned up easily.
+ if(reference in beam_master)
+ var/list/turf_master = beam_master[reference]
+ if("[icon_state][target_dir]" in turf_master)
+ var/list/turfs = turf_master["[icon_state][target_dir]"]
+ turfs += loc
+ else
+ turf_master["[icon_state][target_dir]"] = list(loc)
+ else
+ var/list/turfs = list()
+ turfs["[icon_state][target_dir]"] = list(loc)
+ beam_master[reference] = turfs
+ else
+ first = 0
+
+ cleanup(reference)
+ return
+
+ proc/cleanup(reference) //Waits .3 seconds then removes the overlay.
+ src = null
+ sleep(3)
+ var/list/turf_master = beam_master[reference]
+ for(var/laser_state in turf_master)
+ var/list/turfs = turf_master[laser_state]
+ for(var/turf/T in turfs)
+ T.overlays -= beam_master[laser_state]
+ return
+
+/obj/item/projectile/beam/practice
name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -45,7 +111,7 @@
-/obj/item/projectile/bluetag
+/obj/item/projectile/beam/bluetag
name = "lasertag beam"
icon_state = "bluelaser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -60,7 +126,7 @@
M.Weaken(5)
return 1
-/obj/item/projectile/redtag
+/obj/item/projectile/beam/redtag
name = "lasertag beam"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -75,7 +141,7 @@
M.Weaken(5)
return 1
-/obj/item/projectile/omnitag//A laser tag bolt that stuns EVERYONE
+/obj/item/projectile/beam/omnitag//A laser tag bolt that stuns EVERYONE
name = "lasertag beam"
icon_state = "omnilaser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
diff --git a/code/modules/research/xenoarchaeology/artifact.dm b/code/modules/research/xenoarchaeology/artifact.dm
index 8c63e2667aa..79c4b7c97cd 100644
--- a/code/modules/research/xenoarchaeology/artifact.dm
+++ b/code/modules/research/xenoarchaeology/artifact.dm
@@ -153,8 +153,8 @@
if(istype(P,/obj/item/projectile/beam)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/ion)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/energy)) src.Artifact_Activate()
- else if(istype(P,/obj/item/projectile/bluetag)) src.Artifact_Activate()
- else if(istype(P,/obj/item/projectile/redtag)) src.Artifact_Activate()
+ else if(istype(P,/obj/item/projectile/beam/bluetag)) src.Artifact_Activate()
+ else if(istype(P,/obj/item/projectile/beam/redtag)) src.Artifact_Activate()
if (my_effect.trigger == "heat")
if(istype(P,/obj/item/projectile/temp)) src.Artifact_Activate()
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 4abe9b2a6aa..6c5768a084b 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -26,7 +26,7 @@ em {font-style: normal; font-weight: bold;}
.deadsay {color: #5c00e6;}
.radio {color: #008000;}
.deptradio {color: #993399;}
-.comradio {color: #ACA82D;}
+.comradio {color: #885500;}
.syndradio {color: #6D3F40;}
.alert {color: #ff0000;}
diff --git a/html/changelog.html b/html/changelog.html
index 5d168f5e282..d27dfac9c0f 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,22 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit though. Thanks. -->
+