Merge pull request #5766 from Baystation12/dev-freeze

(0.1.14) Merging [Merging time]
This commit is contained in:
Snapshot
2014-07-25 17:36:14 -07:00
118 changed files with 4051 additions and 586 deletions
+2
View File
@@ -746,6 +746,7 @@
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\preferences.dm"
#include "code\modules\client\preferences_gear.dm"
#include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_spawnpoints.dm"
#include "code\modules\client\preferences_toggles.dm"
@@ -952,6 +953,7 @@
#include "code\modules\mob\living\carbon\brain\death.dm"
#include "code\modules\mob\living\carbon\brain\emote.dm"
#include "code\modules\mob\living\carbon\brain\life.dm"
#include "code\modules\mob\living\carbon\brain\login.dm"
#include "code\modules\mob\living\carbon\brain\MMI.dm"
#include "code\modules\mob\living\carbon\brain\posibrain.dm"
#include "code\modules\mob\living\carbon\brain\say.dm"
@@ -0,0 +1,110 @@
/*
The overmap system allows adding new maps to the big 'galaxy' map.
Idea is that new sectors can be added by just ticking in new maps and recompiling.
Not real hot-plugging, but still pretty modular.
It uses the fact that all ticked in .dme maps are melded together into one as different zlevels.
Metaobjects are used to make it not affected by map order in .dme and carry some additional info.
*************************************************************
Metaobject
*************************************************************
/obj/effect/mapinfo, sectors.dm
Used to build overmap in beginning, has basic information needed to create overmap objects and make shuttles work.
Its name and icon (if non-standard) vars will be applied to resulting overmap object.
'mapy' and 'mapx' vars are optional, sector will be assigned random overmap coordinates if they are not set.
Has two important vars:
obj_type - type of overmap object it spawns. Could be overriden for custom overmap objects.
landing_area - type of area used as inbound shuttle landing, null if no shuttle landing area.
Object could be placed anywhere on zlevel. Should only be placed on zlevel that should appear on overmap as a separate entitety.
Right after creation it sends itself to nullspace and creates an overmap object, corresponding to this zlevel.
*************************************************************
Overmap object
*************************************************************
/obj/effect/map, sectors.dm
Represents a zlevel on the overmap. Spawned by metaobjects at the startup.
var/area/shuttle/shuttle_landing - keeps a reference to the area of where inbound shuttles should land
-CanPass should be overriden for access restrictions
-Crossed/Uncrossed can be overriden for applying custom effects.
Remember to call ..() in children, it updates ship's current sector.
subtype /ship of this object represents spacefaring vessels.
It has 'current_sector' var that keeps refernce to, well, sector ship currently in.
*************************************************************
Helm console
*************************************************************
/obj/machinery/computer/helm, helm.dm
On creation console seeks a ship overmap object corresponding to this zlevel and links it.
Clicking with empty hand on it starts steering, Cancel-Camera-View stops it.
Helm console relays movement of mob to the linked overmap object.
Helm console currently has no interface. All travel happens instanceously too.
Sector shuttles are not supported currently, only ship shuttles.
*************************************************************
Exploration shuttle terminal
*************************************************************
A generic shuttle controller.
Has a var landing_type defining type of area shuttle should be landing at.
On initalizing, checks for a shuttle corresponding to this zlevel, and creates one if it's not there.
Changes desitnation area depending on current sector ship is in.
Currently updating is called in attack_hand(), until a better place is found.
Currently no modifications were made to interface to display availability of landing area in sector.
*************************************************************
Guide to how make new sector
*************************************************************
0.Map
Remember to define shuttle areas if you want sector be accessible via shuttles.
Currently there are no other ways to reach sectors from ships.
In examples, 4x6 shuttle area is used. In case of shuttle area being too big, it will apear in bottom left corner of it.
Remember to put a helm console and engine control console on ship maps.
Ships need engines to move. Currently there are only thermal engines.
Thermal engines are just a unary atmopheric machine, like a vent. They need high-pressure gas input to produce more thrust.
1.Metaobject
All vars needed for it to work could be set directly in map editor, so in most cases you won't have to define new in code.
Remember to set landing_area var for sectors.
2.Overmap object
If you need custom behaviour on entering/leaving this sector, or restricting access to it, you can define your custom map object.
Remember to put this new type into spawn_type var of metaobject.
3.Shuttle console
Remember to place one on the actual shuttle too, or it won't be able to return from sector without ship-side recall.
Remember to set landing_type var to ship-side shuttle area type.
shuttle_tag can be set to custom name (it shows up in console interface)
5.Engines
Actual engines could be any type of machinery, as long as it creates a ship_engine datum for itself.
6.Tick map in and compile.
Sector should appear on overmap (in random place if you didn't set mapx,mapy)
TODO:
more mechanics to moving ship:
actually working engine objects
unary atmospheric machinery
give more thrust the more pressure gas has
ships have mass var, which is used to caalculate how much acceleration those engines give
better space travel / stragglers handling
shuttle console:
checking occupied pad or not with docking controllers
?landing pad size detection
non-zlevel overmap objects
field generator
meteor fields
speed-based chance for a rock in the ship
debris fields
speed-based chance of
debirs in the ship
a drone
EMP
nebulaes
*/
@@ -0,0 +1,35 @@
//Zlevel where overmap objects should be
#define OVERMAP_ZLEVEL 1
//How far from the edge of overmap zlevel could randomly placed objects spawn
#define OVERMAP_EDGE 7
//list used to track which zlevels are being 'moved' by the proc below
var/list/moving_levels = list()
//Proc to 'move' stars in spess
//yes it looks ugly, but it should only fire when state actually change.
//null direction stops movement
proc/toggle_move_stars(zlevel, direction)
if(!zlevel)
return
var/gen_dir = null
if(direction & (NORTH|SOUTH))
gen_dir += "ns"
else if(direction & (EAST|WEST))
gen_dir += "ew"
if(!direction)
gen_dir = null
if (moving_levels["zlevel"] != gen_dir)
moving_levels["zlevel"] = gen_dir
for(var/turf/space/S in world)
if(S.z == zlevel)
spawn(0)
var/turf/T = S
if(!gen_dir)
T.icon_state = "[((T.x + T.y) ^ ~(T.x * T.y) + T.z) % 25]"
else
T.icon_state = "speedspace_[gen_dir]_[rand(1,15)]"
for(var/atom/movable/AM in T)
if (!AM.anchored)
AM.throw_at(get_step(T,reverse_direction(direction)), 5, 1)
@@ -0,0 +1,95 @@
//===================================================================================
//Hook for building overmap
//===================================================================================
var/global/list/map_sectors = list()
/hook/startup/proc/build_map()
accessable_z_levels = list() //no space travel with this system, at least not like this
testing("Building overmap...")
var/obj/effect/mapinfo/data
for(var/level in 1 to world.maxz)
data = locate("sector[level]")
if (data)
testing("Located sector \"[data.name]\" at [data.mapx],[data.mapy] corresponding to zlevel [level]")
map_sectors["[level]"] = new data.obj_type(data)
return 1
//===================================================================================
//Metaobject for storing information about sector this zlevel is representing.
//Should be placed only once on every zlevel.
//===================================================================================
/obj/effect/mapinfo/
name = "map info metaobject"
icon = 'icons/mob/screen1.dmi'
icon_state = "x2"
invisibility = 101
var/obj_type //type of overmap object it spawns
var/landing_area //type of area used as inbound shuttle landing, null if no shuttle landing area
var/zlevel
var/mapx //coordinates on the
var/mapy //overmap zlevel
var/known = 1
/obj/effect/mapinfo/New()
tag = "sector[z]"
zlevel = z
loc = null
/obj/effect/mapinfo/sector
name = "generic sector"
obj_type = /obj/effect/map/sector
/obj/effect/mapinfo/ship
name = "generic ship"
obj_type = /obj/effect/map/ship
//===================================================================================
//Overmap object representing zlevel
//===================================================================================
/obj/effect/map
name = "map object"
icon = 'icons/obj/items.dmi'
icon_state = "sheet-plasteel"
var/map_z = 0
var/area/shuttle/shuttle_landing
var/always_known = 1
/obj/effect/map/New(var/obj/effect/mapinfo/data)
map_z = data.zlevel
name = data.name
always_known = data.known
if (data.icon != 'icons/mob/screen1.dmi')
icon = data.icon
icon_state = data.icon_state
if(data.desc)
desc = data.desc
var/new_x = data.mapx ? data.mapx : rand(OVERMAP_EDGE, world.maxx - OVERMAP_EDGE)
var/new_y = data.mapy ? data.mapy : rand(OVERMAP_EDGE, world.maxy - OVERMAP_EDGE)
loc = locate(new_x, new_y, OVERMAP_ZLEVEL)
if(data.landing_area)
shuttle_landing = locate(data.landing_area)
/obj/effect/map/CanPass(atom/movable/A)
testing("[A] attempts to enter sector\"[name]\"")
return 1
/obj/effect/map/Crossed(atom/movable/A)
testing("[A] has entered sector\"[name]\"")
if (istype(A,/obj/effect/map/ship))
var/obj/effect/map/ship/S = A
S.current_sector = src
/obj/effect/map/Uncrossed(atom/movable/A)
testing("[A] has left sector\"[name]\"")
if (istype(A,/obj/effect/map/ship))
var/obj/effect/map/ship/S = A
S.current_sector = null
/obj/effect/map/sector
name = "generic sector"
desc = "Sector with some stuff in it."
anchored = 1
@@ -0,0 +1,99 @@
//Engine control and monitoring console
/obj/machinery/computer/engines
name = "engines control console"
icon_state = "id"
var/state = "status"
var/list/engines = list()
var/obj/effect/map/ship/linked
/obj/machinery/computer/engines/initialize()
linked = map_sectors["[z]"]
if (linked)
if (!linked.eng_control)
linked.eng_control = src
testing("Engines console at level [z] found a corresponding overmap object '[linked.name]'.")
else
testing("Engines console at level [z] was unable to find a corresponding overmap object.")
for(var/datum/ship_engine/E in engines)
if (E.zlevel == z && !(E in engines))
engines += E
/obj/machinery/computer/engines/attack_hand(var/mob/user as mob)
if(..())
user.unset_machine()
return
if(!isAI(user))
user.set_machine(src)
ui_interact(user)
/obj/machinery/computer/engines/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
if(!linked)
return
var/data[0]
data["state"] = state
var/list/enginfo[0]
for(var/datum/ship_engine/E in engines)
var/list/rdata[0]
rdata["eng_type"] = E.name
rdata["eng_on"] = E.is_on()
rdata["eng_thrust"] = E.get_thrust()
rdata["eng_thrust_limiter"] = round(E.get_thrust_limit()*100)
rdata["eng_status"] = E.get_status()
rdata["eng_reference"] = "\ref[E]"
enginfo.Add(list(rdata))
data["engines_info"] = enginfo
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
ui = new(user, src, ui_key, "engines_control.tmpl", "[linked.name] Engines Control", 380, 530)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/computer/engines/Topic(href, href_list)
if(..())
return
if(href_list["state"])
state = href_list["state"]
if(href_list["engine"])
if(href_list["set_limit"])
var/datum/ship_engine/E = locate(href_list["engine"])
var/newlim = input("Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit()) as num
var/limit = Clamp(newlim/100, 0, 1)
if(E)
E.set_thrust_limit(limit)
if(href_list["limit"])
var/datum/ship_engine/E = locate(href_list["engine"])
var/limit = Clamp(E.get_thrust_limit() + text2num(href_list["limit"]), 0, 1)
if(E)
E.set_thrust_limit(limit)
if(href_list["toggle"])
var/datum/ship_engine/E = locate(href_list["engine"])
if(E)
E.toggle()
add_fingerprint(usr)
updateUsrDialog()
/obj/machinery/computer/engines/proc/burn()
if(engines.len == 0)
return 0
var/res = 0
for(var/datum/ship_engine/E in engines)
res |= E.burn()
return res
/obj/machinery/computer/engines/proc/get_total_thrust()
for(var/datum/ship_engine/E in engines)
. += E.get_thrust()
@@ -0,0 +1,174 @@
/obj/machinery/computer/helm
name = "helm control console"
icon_state = "id"
var/state = "status"
var/obj/effect/map/ship/linked //connected overmap object
var/autopilot = 0
var/manual_control = 0
var/list/known_sectors = list()
var/dx //desitnation
var/dy //coordinates
/obj/machinery/computer/helm/initialize()
linked = map_sectors["[z]"]
if (linked)
if(!linked.nav_control)
linked.nav_control = src
testing("Helm console at level [z] found a corresponding overmap object '[linked.name]'.")
else
testing("Helm console at level [z] was unable to find a corresponding overmap object.")
for(var/level in map_sectors)
var/obj/effect/map/sector/S = map_sectors["[level]"]
if (istype(S) && S.always_known)
var/datum/data/record/R = new()
R.fields["name"] = S.name
R.fields["x"] = S.x
R.fields["y"] = S.y
known_sectors += R
/obj/machinery/computer/helm/process()
..()
if (autopilot && dx && dy)
var/turf/T = locate(dx,dy,1)
if(linked.loc == T)
if(linked.is_still())
autopilot = 0
else
linked.decelerate()
var/brake_path = linked.get_brake_path()
if(get_dist(linked.loc, T) > brake_path)
linked.accelerate(get_dir(linked.loc, T))
else
linked.decelerate()
return
/obj/machinery/computer/helm/relaymove(var/mob/user, direction)
if(manual_control && linked)
linked.relaymove(user,direction)
return 1
/obj/machinery/computer/helm/check_eye(var/mob/user as mob)
if (!manual_control)
return null
if (!get_dist(user, src) > 1 || user.blinded || !linked )
return null
user.reset_view(linked)
return 1
/obj/machinery/computer/helm/attack_hand(var/mob/user as mob)
if(..())
user.unset_machine()
manual_control = 0
return
if(!isAI(user))
user.set_machine(src)
ui_interact(user)
/obj/machinery/computer/helm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
if(!linked)
return
var/data[0]
data["state"] = state
data["sector"] = linked.current_sector ? linked.current_sector.name : "Deep Space"
data["sector_info"] = linked.current_sector ? linked.current_sector.desc : "Not Available"
data["s_x"] = linked.x
data["s_y"] = linked.y
data["dest"] = dy && dx
data["d_x"] = dx
data["d_y"] = dy
data["speed"] = linked.get_speed()
data["accel"] = round(linked.get_acceleration())
data["heading"] = linked.get_heading() ? dir2angle(linked.get_heading()) : 0
data["autopilot"] = autopilot
data["manual_control"] = manual_control
var/list/locations[0]
for (var/datum/data/record/R in known_sectors)
var/list/rdata[0]
rdata["name"] = R.fields["name"]
rdata["x"] = R.fields["x"]
rdata["y"] = R.fields["y"]
rdata["reference"] = "\ref[R]"
locations.Add(list(rdata))
data["locations"] = locations
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
ui = new(user, src, ui_key, "helm.tmpl", "[linked.name] Helm Control", 380, 530)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/computer/helm/Topic(href, href_list)
if(..())
return
if (!linked)
return
if (href_list["add"])
var/datum/data/record/R = new()
var/sec_name = input("Input naviation entry name", "New navigation entry", "Sector #[known_sectors.len]") as text
if(!sec_name)
sec_name = "Sector #[known_sectors.len]"
R.fields["name"] = sec_name
switch(href_list["add"])
if("current")
R.fields["x"] = linked.x
R.fields["y"] = linked.y
if("new")
var/newx = input("Input new entry x coordinate", "Coordinate input", linked.x) as num
R.fields["x"] = Clamp(newx, 1, world.maxx)
var/newy = input("Input new entry y coordinate", "Coordinate input", linked.y) as num
R.fields["y"] = Clamp(newy, 1, world.maxy)
known_sectors += R
if (href_list["remove"])
var/datum/data/record/R = locate(href_list["remove"])
known_sectors.Remove(R)
if (href_list["setx"])
var/newx = input("Input new destiniation x coordinate", "Coordinate input", dx) as num|null
if (newx)
dx = Clamp(newx, 1, world.maxx)
if (href_list["sety"])
var/newy = input("Input new destiniation y coordinate", "Coordinate input", dy) as num|null
if (newy)
dy = Clamp(newy, 1, world.maxy)
if (href_list["x"] && href_list["y"])
dx = text2num(href_list["x"])
dy = text2num(href_list["y"])
if (href_list["reset"])
dx = 0
dy = 0
if (href_list["move"])
var/ndir = text2num(href_list["move"])
linked.relaymove(usr, ndir)
if (href_list["brake"])
linked.decelerate()
if (href_list["apilot"])
autopilot = !autopilot
if (href_list["manual"])
manual_control = !manual_control
if (href_list["state"])
state = href_list["state"]
add_fingerprint(usr)
updateUsrDialog()
@@ -0,0 +1,139 @@
//Shuttle controller computer for shuttles going between sectors
/datum/shuttle/ferry/var/range = 0 //how many overmap tiles can shuttle go, for picking destinatiosn and returning.
/obj/machinery/computer/shuttle_control/explore
name = "exploration shuttle console"
shuttle_tag = "Exploration"
req_access = list()
var/landing_type //area for shuttle ship-side
var/obj/effect/map/destination //current destination
var/obj/effect/map/home //current destination
/obj/machinery/computer/shuttle_control/explore/initialize()
..()
home = map_sectors["[z]"]
shuttle_tag = "[shuttle_tag]-[z]"
if(!shuttle_controller.shuttles[shuttle_tag])
var/datum/shuttle/ferry/shuttle = new()
shuttle.warmup_time = 10
shuttle.area_station = locate(landing_type)
shuttle.area_offsite = shuttle.area_station
shuttle_controller.shuttles[shuttle_tag] = shuttle
shuttle_controller.process_shuttles += shuttle
testing("Exploration shuttle '[shuttle_tag]' at zlevel [z] successfully added.")
//Sets destination to new sector. Can be null.
/obj/machinery/computer/shuttle_control/explore/proc/update_destination(var/obj/effect/map/D)
destination = D
if(destination && shuttle_controller.shuttles[shuttle_tag])
var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag]
shuttle.area_offsite = destination.shuttle_landing
testing("Shuttle controller [shuttle_tag] now sends shuttle to [destination]")
shuttle_controller.shuttles[shuttle_tag] = shuttle
//Gets all sectors with landing zones in shuttle's range
/obj/machinery/computer/shuttle_control/explore/proc/get_possible_destinations()
var/list/res = list()
var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag]
for (var/obj/effect/map/S in orange(shuttle.range, home))
if(S.shuttle_landing)
res += S
return res
//Checks if current destination is still reachable
/obj/machinery/computer/shuttle_control/explore/proc/check_destination()
var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag]
return shuttle && destination && get_dist(home, destination) <= shuttle.range
/obj/machinery/computer/shuttle_control/explore/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
var/data[0]
var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag]
if (!istype(shuttle))
return
//If we are already there, or can't reach place anymore, reset destination
if(!shuttle.location && !check_destination())
destination = null
//check if shuttle can fly at all
var/can_go = !isnull(destination)
var/current_destination = destination ? destination.name : "None"
//shuttle doesn't need destination set to return home, as long as it's in range.
if(shuttle.location)
current_destination = "Return"
var/area/offsite = shuttle.area_offsite
var/obj/effect/map/cur_loc = map_sectors["[offsite.z]"]
can_go = (get_dist(home,cur_loc) <= shuttle.range)
//disable picking locations if there are none, or shuttle is already off-site
var/list/possible_d = get_possible_destinations()
var/can_pick = !shuttle.location && possible_d.len
var/shuttle_state
switch(shuttle.moving_status)
if(SHUTTLE_IDLE) shuttle_state = "idle"
if(SHUTTLE_WARMUP) shuttle_state = "warmup"
if(SHUTTLE_INTRANSIT) shuttle_state = "in_transit"
var/shuttle_status
switch (shuttle.process_state)
if(IDLE_STATE)
if (shuttle.in_use)
shuttle_status = "Busy."
else if (!shuttle.location)
shuttle_status = "Standing-by at station."
else
shuttle_status = "Standing-by at offsite location."
if(WAIT_LAUNCH)
shuttle_status = "Shuttle has recieved command and will depart shortly."
if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination."
if(WAIT_FINISH)
shuttle_status = "Arriving at destination now."
data = list(
"destination_name" = current_destination,
"can_pick" = can_pick,
"shuttle_status" = shuttle_status,
"shuttle_state" = shuttle_state,
"has_docking" = shuttle.docking_controller? 1 : 0,
"docking_status" = shuttle.docking_controller? shuttle.docking_controller.get_docking_status() : null,
"docking_override" = shuttle.docking_controller? shuttle.docking_controller.override_enabled : null,
"can_launch" = can_go && shuttle.can_launch(),
"can_cancel" = can_go && shuttle.can_cancel(),
"can_force" = can_go && shuttle.can_force(),
)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
ui = new(user, src, ui_key, "shuttle_control_console_exploration.tmpl", "[shuttle_tag] Shuttle Control", 470, 310)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/computer/shuttle_control/explore/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag]
if (!istype(shuttle))
return
if(href_list["pick"])
var/obj/effect/map/self = map_sectors["[z]"]
if(self)
var/list/possible_d = get_possible_destinations()
var/obj/effect/map/D
if(possible_d.len)
D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d
update_destination(D)
if(href_list["move"])
shuttle.launch(src)
if(href_list["force"])
shuttle.force_launch(src)
else if(href_list["cancel"])
shuttle.cancel_launch(src)
@@ -0,0 +1,60 @@
//Engine component object
var/list/ship_engines = list()
/datum/ship_engine
var/name = "ship engine"
var/obj/machinery/engine //actual engine object
var/zlevel = 0
/datum/ship_engine/New(var/obj/machinery/holder)
engine = holder
zlevel = holder.z
for(var/obj/machinery/computer/engines/E in machines)
if (E.z == zlevel && !(src in E.engines))
E.engines += src
break
//Tries to fire the engine. If successfull, returns 1
/datum/ship_engine/proc/burn()
if(!engine)
die()
return 1
//Returns status string for this engine
/datum/ship_engine/proc/get_status()
if(!engine)
die()
return "All systems nominal"
/datum/ship_engine/proc/get_thrust()
if(!engine)
die()
return 100
//Sets thrust limiter, a number between 0 and 1
/datum/ship_engine/proc/set_thrust_limit(var/new_limit)
if(!engine)
die()
return 1
/datum/ship_engine/proc/get_thrust_limit()
if(!engine)
die()
return 1
/datum/ship_engine/proc/is_on()
if(!engine)
die()
return 1
/datum/ship_engine/proc/toggle()
if(!engine)
die()
return 1
/datum/ship_engine/proc/die()
for(var/obj/machinery/computer/engines/E in machines)
if (E.z == zlevel)
E.engines -= src
break
del(src)
@@ -0,0 +1,99 @@
//Thermal nozzle engine
/datum/ship_engine/thermal
name = "thermal engine"
/datum/ship_engine/thermal/get_status()
..()
var/obj/machinery/atmospherics/unary/engine/E = engine
return "Fuel pressure: [E.air_contents.return_pressure()]"
/datum/ship_engine/thermal/get_thrust()
..()
var/obj/machinery/atmospherics/unary/engine/E = engine
if(!is_on())
return 0
var/pressurized_coef = E.air_contents.return_pressure()/E.effective_pressure
return round(E.thrust_limit * E.nominal_thrust * pressurized_coef)
/datum/ship_engine/thermal/burn()
..()
var/obj/machinery/atmospherics/unary/engine/E = engine
return E.burn()
/datum/ship_engine/thermal/set_thrust_limit(var/new_limit)
..()
var/obj/machinery/atmospherics/unary/engine/E = engine
E.thrust_limit = new_limit
/datum/ship_engine/thermal/get_thrust_limit()
..()
var/obj/machinery/atmospherics/unary/engine/E = engine
return E.thrust_limit
/datum/ship_engine/thermal/is_on()
..()
var/obj/machinery/atmospherics/unary/engine/E = engine
return E.on
/datum/ship_engine/thermal/toggle()
..()
var/obj/machinery/atmospherics/unary/engine/E = engine
E.on = !E.on
//Actual thermal nozzle engine object
/obj/machinery/atmospherics/unary/engine
name = "engine nozzle"
desc = "Simple thermal nozzle, uses heated gast to propell the ship."
icon = 'icons/obj/ship_engine.dmi'
icon_state = "nozzle"
var/on = 1
var/thrust_limit = 1 //Value between 1 and 0 to limit the resulting thrust
var/nominal_thrust = 3000
var/effective_pressure = 3000
var/datum/ship_engine/thermal/controller
/obj/machinery/atmospherics/unary/engine/initialize()
..()
controller = new(src)
/obj/machinery/atmospherics/unary/engine/Del()
..()
controller.die()
/obj/machinery/atmospherics/unary/engine/proc/burn()
if (!on)
return
if(air_contents.temperature > 0)
var/transfer_moles = 100 * air_contents.volume/max(air_contents.temperature * R_IDEAL_GAS_EQUATION, 0,01)
transfer_moles = round(thrust_limit * transfer_moles, 0.01)
if(transfer_moles > air_contents.total_moles)
on = !on
return 0
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
loc.assume_air(removed)
if(air_contents.temperature > PHORON_MINIMUM_BURN_TEMPERATURE)
var/exhaust_dir = reverse_direction(dir)
var/turf/T = get_step(src,exhaust_dir)
if(T)
new/obj/effect/engine_exhaust(T,exhaust_dir,air_contents.temperature)
return 1
//Exhaust effect
/obj/effect/engine_exhaust
name = "engine exhaust"
icon = 'icons/effects/effects.dmi'
icon_state = "exhaust"
anchored = 1
New(var/turf/nloc, var/ndir, var/temp)
dir = ndir
..(nloc)
if(nloc)
nloc.hotspot_expose(temp,125)
spawn(20)
loc = null
@@ -0,0 +1,105 @@
/obj/effect/map/ship
name = "generic ship"
desc = "Space faring vessel."
icon_state = "sheet-sandstone"
var/vessel_mass = 9000 //tonnes, random number
var/default_delay = 60
var/list/speed = list(0,0)
var/last_burn = 0
var/list/last_movement = list(0,0)
var/fore_dir = NORTH
var/obj/effect/map/current_sector
var/obj/machinery/computer/helm/nav_control
var/obj/machinery/computer/engines/eng_control
/obj/effect/map/ship/initialize()
for(var/obj/machinery/computer/engines/E in machines)
if (E.z == map_z)
eng_control = E
break
for(var/obj/machinery/computer/helm/H in machines)
if (H.z == map_z)
nav_control = H
break
processing_objects.Add(src)
/obj/effect/map/ship/relaymove(mob/user, direction)
accelerate(direction)
/obj/effect/map/ship/proc/is_still()
return !(speed[1] || speed[2])
/obj/effect/map/ship/proc/get_acceleration()
return eng_control.get_total_thrust()/vessel_mass
/obj/effect/map/ship/proc/get_speed()
return round(sqrt(speed[1]*speed[1] + speed[2]*speed[2]))
/obj/effect/map/ship/proc/get_heading()
var/res = 0
if(speed[1])
if(speed[1] > 0)
res |= EAST
else
res |= WEST
if(speed[2])
if(speed[2] > 0)
res |= NORTH
else
res |= SOUTH
return res
/obj/effect/map/ship/proc/adjust_speed(n_x, n_y)
speed[1] = Clamp(speed[1] + n_x, -default_delay, default_delay)
speed[2] = Clamp(speed[2] + n_y, -default_delay, default_delay)
if(is_still())
toggle_move_stars(map_z)
else
toggle_move_stars(map_z, fore_dir)
/obj/effect/map/ship/proc/can_burn()
if (!eng_control)
return 0
if (world.time < last_burn + 10)
return 0
if (!eng_control.burn())
return 0
return 1
/obj/effect/map/ship/proc/get_brake_path()
if(!get_acceleration())
return INFINITY
return max(abs(speed[1]),abs(speed[2]))/get_acceleration()
/obj/effect/map/ship/proc/decelerate()
if(!is_still() && can_burn())
if (speed[1])
adjust_speed(-SIGN(speed[1]) * min(get_acceleration(),speed[1]), 0)
if (speed[2])
adjust_speed(0, -SIGN(speed[2]) * min(get_acceleration(),speed[2]))
last_burn = world.time
/obj/effect/map/ship/proc/accelerate(direction)
if(can_burn())
last_burn = world.time
if(direction & EAST)
adjust_speed(get_acceleration(), 0)
if(direction & WEST)
adjust_speed(-get_acceleration(), 0)
if(direction & NORTH)
adjust_speed(0, get_acceleration())
if(direction & SOUTH)
adjust_speed(0, -get_acceleration())
/obj/effect/map/ship/process()
if(!is_still())
var/list/deltas = list(0,0)
for(var/i=1, i<=2, i++)
if(speed[i] && world.time > last_movement[i] + default_delay - speed[i])
deltas[i] = speed[i] > 0 ? 1 : -1
last_movement[i] = world.time
var/turf/newloc = locate(x + deltas[1], y + deltas[2], z)
if(newloc)
Move(newloc)
+41 -8
View File
@@ -30,18 +30,18 @@
var/obj/machinery/computer3/laptop/stored_computer = null
verb/open_computer()
set name = "open laptop"
set name = "Open Laptop"
set category = "Object"
set src in view(1)
if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
usr << "\red You can't do that."
return
if(!Adjacent(usr))
usr << "You can't reach it."
return
if(!istype(loc,/turf))
usr << "[src] is too bulky! You'll have to set it down."
return
@@ -69,9 +69,42 @@
if(Adjacent(usr))
open_computer()
//Quickfix until Snapshot works out how he wants to redo power. ~Z
/obj/item/device/laptop/verb/eject_id()
set category = "Object"
set name = "Eject ID Card"
set src in oview(1)
if(stored_computer)
stored_computer.eject_id()
/obj/machinery/computer3/laptop/verb/eject_id()
set category = "Object"
set name = "Eject ID Card"
set src in oview(1)
var/obj/item/part/computer/cardslot/C = locate() in src.contents
if(!C)
usr << "There is no card port on the laptop."
return
var/obj/item/weapon/card/id/card
if(C.reader)
card = C.reader
else if(C.writer)
card = C.writer
else
usr << "There is nothing to remove from the laptop card port."
return
usr << "You remove [card] from the laptop."
C.remove(card)
/obj/machinery/computer3/laptop
name = "Laptop Computer"
desc = "A clamshell portable computer. It is open."
desc = "A clamshell portable computer. It is open."
icon_state = "laptop"
density = 0
@@ -90,15 +123,15 @@
set name = "Close Laptop"
set category = "Object"
set src in view(1)
if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
usr << "\red You can't do that."
return
if(!Adjacent(usr))
usr << "You can't reach it."
return
if(istype(loc,/obj/item/device/laptop))
testing("Close closed computer")
return
+1 -1
View File
@@ -141,7 +141,7 @@ var/const/tk_maxrange = 15
else
apply_focus_overlay()
focus.throw_at(target, 10, 1)
focus.throw_at(target, 10, 1, user)
last_throw = world.time
return
+11 -7
View File
@@ -81,13 +81,6 @@ datum/controller/game_controller/proc/setup()
for(var/i=0, i<max_secret_rooms, i++)
make_mining_asteroid_secret()
//Create the mining ore distribution map.
asteroid_ore_map = new /datum/ore_distribution()
asteroid_ore_map.populate_distribution_map()
//Set up spawn points.
populate_spawn_points()
spawn(0)
if(ticker)
ticker.pregame()
@@ -116,6 +109,17 @@ datum/controller/game_controller/proc/setup_objects()
var/obj/machinery/atmospherics/unary/vent_scrubber/T = U
T.broadcast_status()
//Create the mining ore distribution map.
//Create the mining ore distribution map.
asteroid_ore_map = new /datum/ore_distribution()
asteroid_ore_map.populate_distribution_map()
//Set up spawn points.
populate_spawn_points()
//Set up gear list.
populate_gear_list()
world << "\red \b Initializations complete."
sleep(-1)
+5 -5
View File
@@ -533,7 +533,7 @@ datum/mind
special_role = null
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memoize_cult_objectives(src)
cult.memorize_cult_objectives(src)
current << "\red <FONT size = 3><B>The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!</B></FONT>"
memory = ""
if(src in ticker.mode.traitors)
@@ -543,7 +543,7 @@ datum/mind
log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
else if (href_list["revolution"])
current.hud_updateflag |= (1 << SPECIALROLE_HUD)
current.hud_updateflag |= (1 << SPECIALROLE_HUD)
switch(href_list["revolution"])
if("clear")
@@ -648,7 +648,7 @@ datum/mind
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
if(!config.objectives_disabled)
cult.memoize_cult_objectives(src)
cult.memorize_cult_objectives(src)
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a cultist!</B></FONT>"
memory = ""
log_admin("[key_name_admin(usr)] has de-cult'ed [current].")
@@ -663,7 +663,7 @@ datum/mind
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
if(!config.objectives_disabled)
cult.memoize_cult_objectives(src)
cult.memorize_cult_objectives(src)
log_admin("[key_name_admin(usr)] has cult'ed [current].")
if("tome")
var/mob/living/carbon/human/H = current
@@ -1126,7 +1126,7 @@ datum/mind
current << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memoize_cult_objectives(src)
cult.memorize_cult_objectives(src)
else
var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
current << "<B>Objective #1</B>: [explanation]"
+2 -1
View File
@@ -303,9 +303,10 @@ var/global/list/PDA_Manifest = list()
throw_speed = 1
throw_range = 20
flags = FPRINT | TABLEPASS | CONDUCT
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
user.drop_item()
src.throw_at(target, throw_range, throw_speed)
src.throw_at(target, throw_range, throw_speed, user)
/obj/effect/stop
var/victim = null
-10
View File
@@ -450,16 +450,6 @@
usr.client.eye = target
/obj/item/weapon/syntiflesh
name = "syntiflesh"
desc = "Meat that appears...strange..."
icon = 'icons/obj/food.dmi'
icon_state = "meat"
flags = FPRINT | TABLEPASS | CONDUCT
w_class = 2.0
origin_tech = "biotech=2"
/*
/obj/item/weapon/cigarpacket
name = "Pete's Cuban Cigars"
+2 -21
View File
@@ -22,27 +22,6 @@
//Detective Work, used for the duplicate data points kept in the scanners
var/list/original_atom
/atom/proc/throw_impact(atom/hit_atom, var/speed)
if(istype(hit_atom,/mob/living))
var/mob/living/M = hit_atom
M.hitby(src,speed)
else if(isobj(hit_atom))
var/obj/O = hit_atom
if(!O.anchored)
step(O, src.dir)
O.hitby(src,speed)
else if(isturf(hit_atom))
var/turf/T = hit_atom
if(T.density)
spawn(2)
step(src, turn(src.dir, 180))
if(istype(src,/mob/living))
var/mob/living/M = src
M.take_organ_damage(20)
/atom/proc/assume_air(datum/gas_mixture/giver)
return null
@@ -237,6 +216,8 @@ its easier to just keep the beam vertical.
return
/atom/proc/hitby(atom/movable/AM as mob|obj)
if (density)
AM.throwing = 0
return
/atom/proc/add_hiddenprint(mob/living/M as mob)
+31 -6
View File
@@ -7,6 +7,8 @@
var/l_move_time = 1
var/m_flag = 1
var/throwing = 0
var/thrower
var/turf/throw_source = null
var/throw_speed = 2
var/throw_range = 7
var/moved_recently = 0
@@ -25,7 +27,6 @@
/atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes)
if(src.throwing)
src.throw_impact(A)
src.throwing = 0
spawn( 0 )
if ((A && yes))
@@ -44,6 +45,29 @@
return 1
return 0
//called when src is thrown into hit_atom
/atom/movable/proc/throw_impact(atom/hit_atom, var/speed)
if(istype(hit_atom,/mob/living))
var/mob/living/M = hit_atom
M.hitby(src,speed)
else if(isobj(hit_atom))
var/obj/O = hit_atom
if(!O.anchored)
step(O, src.dir)
O.hitby(src,speed)
else if(isturf(hit_atom))
src.throwing = 0
var/turf/T = hit_atom
if(T.density)
spawn(2)
step(src, turn(src.dir, 180))
if(istype(src,/mob/living))
var/mob/living/M = src
M.turf_collision(T, speed)
//decided whether a movable atom being thrown can pass through the turf it is in.
/atom/movable/proc/hit_check(var/speed)
if(src.throwing)
for(var/atom/A in get_turf(src))
@@ -51,18 +75,17 @@
if(istype(A,/mob/living))
if(A:lying) continue
src.throw_impact(A,speed)
if(src.throwing == 1)
src.throwing = 0
if(isobj(A))
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
src.throw_impact(A,speed)
src.throwing = 0
/atom/movable/proc/throw_at(atom/target, range, speed)
/atom/movable/proc/throw_at(atom/target, range, speed, thrower)
if(!target || !src) return 0
//use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target
src.throwing = 1
src.thrower = thrower
src.throw_source = get_turf(src) //store the origin turf
if(usr)
if(HULK in usr.mutations)
@@ -149,8 +172,10 @@
a = get_area(src.loc)
//done throwing, either because it hit something or it finished moving
src.throwing = 0
if(isobj(src)) src.throw_impact(get_turf(src),speed)
src.throwing = 0
src.thrower = null
src.throw_source = null
//Overlays
+3 -3
View File
@@ -99,7 +99,7 @@
update_cult_icons_added(cult_mind)
cult_mind.current << "\blue You are a member of the cult!"
if(!config.objectives_disabled)
memoize_cult_objectives(cult_mind)
memorize_cult_objectives(cult_mind)
else
cult_mind.current << "<font color=blue>Within the rules,</font> try to act as an opposing force to the crew. Further RP and try to make sure other players have </i>fun<i>! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! <b>Please remember all rules aside from those without explicit exceptions apply to antagonists.</i></b>"
cult_mind.special_role = "Cultist"
@@ -109,7 +109,7 @@
..()
/datum/game_mode/cult/proc/memoize_cult_objectives(var/datum/mind/cult_mind)
/datum/game_mode/cult/proc/memorize_cult_objectives(var/datum/mind/cult_mind)
for(var/obj_count = 1,obj_count <= objectives.len,obj_count++)
var/explanation
switch(objectives[obj_count])
@@ -186,7 +186,7 @@
if (!..(cult_mind))
return
if (!config.objectives_disabled)
memoize_cult_objectives(cult_mind)
memorize_cult_objectives(cult_mind)
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1)
+23 -6
View File
@@ -108,16 +108,33 @@ var/list/sacrificed = list()
"\red AAAAAAHHHH!.", \
"\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind) && !jobban_isbanned(M, "cultist"))//putting jobban check here because is_convertable uses mind as argument
ticker.mode.add_cultist(M.mind)
M.mind.special_role = "Cultist"
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
return 1
// Mostly for the benefit of those who resist, but it makes sense for even those who join to have some.. effect.
M.take_overall_damage(0, 10)
var/choice = alert(M,"Do you want to join the cult?","Submit to Nar'Sie","Resist","Submit")
if(choice == "Submit")
ticker.mode.add_cultist(M.mind)
M.mind.special_role = "Cultist"
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
return 1
else if(choice == "Resist")
M.take_overall_damage(0, rand(5, 10)) // You dirty resister cannot handle the damage to your mind. Easily.
// Resist messages go!
var/BurnLoss = M.getFireLoss()
if (BurnLoss < 25) M << "<font color=\"red\"><b>Your blood boils as you force yourself to resist the corruption invading every corner of your mind."
else if (BurnLoss < 45) M << "<font color=\"red\"><b>Your blood boils and your body burns as the corruption further forces itself into your body and mind."
else if (BurnLoss < 75) M << "<font color=\"red\"><b>You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble."
else if (BurnLoss < 100) M << "<font color=\"red\"><b>Your mind turns to ash as the burning flames engulf your very soul and images of Nar'Sie begin to bombard the last remnants of mental resistance."
else M << "<font color=\"red\"><b>Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing."
return 0
else
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"red\"><b>And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.</b></font>"
return 0
return fizzle()
+53 -3
View File
@@ -346,9 +346,44 @@ var/global/datum/controller/occupations/job_master
proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
if(!H) return 0
var/datum/job/job = GetJob(rank)
var/list/spawn_in_storage = list()
if(job)
//Equip custom gear loadout.
if(H.client.prefs.gear && H.client.prefs.gear.len)
for(var/thing in H.client.prefs.gear)
var/datum/gear/G = gear_datums[thing]
if(G)
var/permitted
if(G.allowed_roles)
for(var/job_name in G.allowed_roles)
if(job.title == job_name)
permitted = 1
else
permitted = 1
if(G.whitelisted && !is_alien_whitelisted(H, G.whitelisted))
permitted = 0
if(!permitted)
H << "\red Your current job or whitelist status does not permit you to spawn with [thing]!"
continue
if(G.slot)
H.equip_to_slot_or_del(new G.path(H), G.slot)
H << "\blue Equipping you with [thing]!"
else
spawn_in_storage += thing
//Equip job items.
job.equip(H)
else
H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator."
@@ -428,17 +463,32 @@ var/global/datum/controller/occupations/job_master
new /obj/item/weapon/storage/box/survival(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
//Deferred item spawning.
if(spawn_in_storage && spawn_in_storage.len)
var/obj/item/weapon/storage/B
for(var/obj/item/weapon/storage/S in H.contents)
B = S
break
if(!isnull(B))
for(var/thing in spawn_in_storage)
H << "\blue Placing [thing] in your [B]!"
var/datum/gear/G = gear_datums[thing]
new G.path(B)
else
H << "\red Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug."
//TODO: Generalize this by-species
if(H.species)
if(H.species.name == "Tajaran" || H.species.name == "Unathi")
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1)
else if(H.species.name == "Vox")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(src), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask)
if(!H.r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_r_hand)
H.internal = H.r_hand
else if (!H.l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand)
H.internal = H.l_hand
H.internals.icon_state = "internal1"
+9 -3
View File
@@ -105,6 +105,9 @@
var/temperature_dangerlevel = 0
var/other_dangerlevel = 0
var/alarm_sound_cooldown = 200
var/last_sound_time = 0
/obj/machinery/alarm/server/New()
..()
req_access = list(access_rd, access_atmospherics, access_engine_equip)
@@ -169,6 +172,9 @@
var/turf/simulated/location = loc
if(!istype(location)) return//returns if loc is not simulated
if ((alarm_area.fire || alarm_area.atmosalm >= 2) && world.time > last_sound_time + alarm_sound_cooldown)
last_sound_time = world.time
var/datum/gas_mixture/environment = location.return_air()
//Handle temperature adjustment here.
@@ -317,11 +323,11 @@
if((stat & (NOPOWER|BROKEN)) || shorted)
icon_state = "alarmp"
return
var/icon_level = danger_level
if (alarm_area.atmosalm)
icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow
switch(icon_level)
if (0)
icon_state = "alarm0"
@@ -727,7 +733,7 @@ Toxins: <span class='dl[phoron_dangerlevel]'>[phoron_percent]</span>%<br>
output += "<span class='dl1'>Fire alarm in area</span>"
else
output += "No alerts"
return output
/obj/machinery/alarm/proc/rcon_text()
+1 -1
View File
@@ -394,7 +394,7 @@
if ( emagged ) // Warning, hungry humans detected: throw fertilizer at them
spawn(0)
fert.loc = src.loc
fert.throw_at(target, 16, 3)
fert.throw_at(target, 16, 3, src)
src.visible_message("\red <b>[src] launches [fert.name] at [target.name]!</b>")
flick("farmbot_broke", src)
spawn (FARMBOT_EMAG_DELAY)
+1 -3
View File
@@ -713,9 +713,7 @@ Auto Patrol: []"},
Sa.overlays += image('icons/obj/aibots.dmi', "hs_hole")
Sa.created_name = src.name
new /obj/item/device/assembly/prox_sensor(Tsec)
var/obj/item/weapon/melee/baton/B = new /obj/item/weapon/melee/baton(Tsec)
B.charges = 0
new /obj/item/weapon/melee/baton(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
+1 -1
View File
@@ -217,7 +217,7 @@
var/obj/item/meatslab = allmeat[i]
var/turf/Tx = locate(src.x - i, src.y, src.z)
meatslab.loc = src.loc
meatslab.throw_at(Tx,i,3)
meatslab.throw_at(Tx,i,3,src)
if (!Tx.density)
new /obj/effect/decal/cleanable/blood/gibs(Tx,i)
src.operating = 0
-12
View File
@@ -28,18 +28,6 @@
input = /obj/item/weapon/reagent_containers/food/snacks/meat
output = /obj/item/weapon/reagent_containers/food/snacks/meatball
meat2
input = /obj/item/weapon/syntiflesh
output = /obj/item/weapon/reagent_containers/food/snacks/meatball
/*
monkeymeat
input = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
output = /obj/item/weapon/reagent_containers/food/snacks/meatball
humanmeat
input = /obj/item/weapon/reagent_containers/food/snacks/meat/human
output = /obj/item/weapon/reagent_containers/food/snacks/meatball
*/
potato
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato
output = /obj/item/weapon/reagent_containers/food/snacks/rawsticks
+1 -1
View File
@@ -403,7 +403,7 @@
if(!throw_item)
return 0
spawn(0)
throw_item.throw_at(target,16,3)
throw_item.throw_at(target,16,3,src)
src.visible_message("\red <b>[src] launches [throw_item.name] at [target.name]!</b>")
return 1
+12 -13
View File
@@ -75,25 +75,25 @@ obj/machinery/recharger/process()
if(E.power_supply.charge < E.power_supply.maxcharge)
E.power_supply.give(100)
icon_state = icon_state_charging
use_power(250)
use_power(250/CELLRATE)
else
icon_state = icon_state_charged
return
if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
if(B.charges < initial(B.charges))
B.charges++
icon_state = icon_state_charging
use_power(150)
else
icon_state = icon_state_charged
if(B.bcell)
if(B.bcell.give(1500)) //Because otherwise it takes two minutes to fully charge due to 15k cells. - Neerti
icon_state = icon_state_charging
use_power(200/CELLRATE)
else
icon_state = icon_state_charged
return
if(istype(charging, /obj/item/device/laptop))
var/obj/item/device/laptop/L = charging
if(L.stored_computer.battery.charge < L.stored_computer.battery.maxcharge)
L.stored_computer.battery.give(100)
icon_state = icon_state_charging
use_power(250)
use_power(250/CELLRATE)
else
icon_state = icon_state_charged
return
@@ -110,7 +110,8 @@ obj/machinery/recharger/emp_act(severity)
else if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
B.charges = 0
if(B.bcell)
B.bcell.charge = 0
..(severity)
obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
@@ -122,8 +123,6 @@ obj/machinery/recharger/update_icon() //we have an update_icon() in addition to
// Atlantis: No need for that copy-pasta code, just use var to store icon_states instead.
obj/machinery/recharger/wallcharger
name = "wall recharger"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "wrecharger0"
icon_state_idle = "wrecharger0"
icon_state_charged = "wrecharger2"
icon_state_charging = "wrecharger1"
icon_state_charged = "wrecharger2"
icon_state_idle = "wrecharger0"
+1 -1
View File
@@ -562,7 +562,7 @@
if (!throw_item)
return 0
spawn(0)
throw_item.throw_at(target, 16, 3)
throw_item.throw_at(target, 16, 3, src)
src.visible_message("\red <b>[src] launches [throw_item.name] at [target.name]!</b>")
return 1
+1 -1
View File
@@ -464,7 +464,7 @@
return
else if(target!=locked)
if(locked in view(chassis))
locked.throw_at(target, 14, 1.5)
locked.throw_at(target, 14, 1.5, chassis)
locked = null
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
set_ready_state(0)
+1 -1
View File
@@ -231,7 +231,7 @@
var/missile_range = 30
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/Fire(atom/movable/AM, atom/target, turf/aimloc)
AM.throw_at(target,missile_range, missile_speed)
AM.throw_at(target,missile_range, missile_speed, chassis)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive
name = "SRM-8 Missile Rack"
+1
View File
@@ -469,6 +469,7 @@
return
/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
..()
src.log_message("Hit by [A].",1)
call((proc_res["dynhitby"]||src), "dynhitby")(A)
return
@@ -2,10 +2,19 @@
name = "portable suit cooling unit"
desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling."
w_class = 4
icon = 'icons/obj/device.dmi' //temporary, I hope
icon = 'icons/obj/device.dmi'
icon_state = "suitcooler0"
slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage
//copied from tank.dm
flags = FPRINT | TABLEPASS | CONDUCT
force = 5.0
throwforce = 10.0
throw_speed = 1
throw_range = 4
origin_tech = "magnets=2;materials=2"
var/on = 0 //is it turned on?
var/cover_open = 0 //is the cover open?
var/obj/item/weapon/cell/cell
@@ -29,6 +29,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
null, \
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
new/datum/stack_recipe("metal baseball bat", /obj/item/weapon/baseballbat/metal, 10, time = 20, one_per_turf = 0, on_floor = 1), \
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), \
@@ -70,6 +71,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("air alarm frame", /obj/item/alarm_frame, 2), \
new/datum/stack_recipe("fire alarm frame", /obj/item/firealarm_frame, 2), \
null, \
new/datum/stack_recipe("knife blade", /obj/item/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1) \
)
/obj/item/stack/sheet/metal
@@ -103,6 +105,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), \
new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/rust_fuel_assembly_port_frame, 12, time = 50, one_per_turf = 1), \
new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/rust_fuel_compressor_frame, 12, time = 50, one_per_turf = 1), \
new/datum/stack_recipe("knife grip", /obj/item/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1),
)
/obj/item/stack/sheet/plasteel
@@ -132,6 +135,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0), \
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("baseball bat", /obj/item/weapon/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1) \
// new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0)
)
@@ -82,16 +82,19 @@
C = usr.buckled
var/obj/B = usr.buckled
var/movementdirection = turn(direction,180)
if(C) C.propelled = 1
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
if(C) C.propelled = 4
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 3
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 2
sleep(2)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 1
sleep(2)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 0
@@ -147,5 +147,18 @@ var/last_chew = 0
/obj/item/weapon/handcuffs/cable/white
color = "#FFFFFF"
/obj/item/weapon/handcuffs/cable/attackby(var/obj/item/I, mob/user as mob)
..()
if(istype(I, /obj/item/stack/rods))
var/obj/item/stack/rods/R = I
var/obj/item/weapon/wirerod/W = new /obj/item/weapon/wirerod
R.use(1)
user.put_in_hands(W)
user << "<span class='notice'>You wrap the cable restraint around the top of the rod.</span>"
del(src)
update_icon(user)
/obj/item/weapon/handcuffs/cyborg
dispenser = 1
+124 -58
View File
@@ -1,66 +1,117 @@
//replaces our stun baton code with /tg/station's code
/obj/item/weapon/melee/baton
name = "stun baton"
name = "stunbaton"
desc = "A stun baton for incapacitating people with."
icon_state = "stunbaton"
item_state = "baton"
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
force = 10
force = 15
sharp = 0
edge = 0
throwforce = 7
w_class = 3
var/charges = 10
var/status = 0
var/mob/foundmob = "" //Used in throwing proc.
origin_tech = "combat=2"
attack_verb = list("beaten")
var/stunforce = 7
var/status = 0
var/obj/item/weapon/cell/high/bcell = null
var/hitcost = 1000
suicide_act(mob/user)
viewers(user) << "\red <b>[user] is putting the live [src.name] in \his mouth! It looks like \he's trying to commit suicide.</b>"
return (FIRELOSS)
/obj/item/weapon/melee/baton/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.</span>")
return (FIRELOSS)
/obj/item/weapon/melee/baton/New()
..()
update_icon()
return
/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
..()
bcell = new(src)
update_icon()
return
/obj/item/weapon/melee/baton/proc/deductcharge(var/chrgdeductamt)
if(bcell)
if(bcell.use(chrgdeductamt))
return 1
else
status = 0
update_icon()
return 0
/obj/item/weapon/melee/baton/update_icon()
if(status)
icon_state = "stunbaton_active"
icon_state = "[initial(name)]_active"
else if(!bcell)
icon_state = "[initial(name)]_nocell"
else
icon_state = "stunbaton"
icon_state = "[initial(name)]"
/obj/item/weapon/melee/baton/attack_self(mob/user as mob)
if(status && (CLUMSY in user.mutations) && prob(50))
user << "\red You grab the [src] on the wrong side."
user.Weaken(30)
charges--
if(charges < 1)
/obj/item/weapon/melee/baton/examine()
set src in view(1)
..()
if(bcell)
usr <<"<span class='notice'>The baton is [round(bcell.percent())]% charged.</span>"
if(!bcell)
usr <<"<span class='warning'>The baton does not have a power source installed.</span>"
/obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/cell))
if(!bcell)
user.drop_item()
W.loc = src
bcell = W
user << "<span class='notice'>You install a cell in [src].</span>"
update_icon()
else
user << "<span class='notice'>[src] already has a cell.</span>"
else if(istype(W, /obj/item/weapon/screwdriver))
if(bcell)
bcell.updateicon()
bcell.loc = get_turf(src.loc)
bcell = null
user << "<span class='notice'>You remove the cell from the [src].</span>"
status = 0
update_icon()
return
if(charges > 0)
return
..()
return
/obj/item/weapon/melee/baton/attack_self(mob/user)
if(bcell && bcell.charge > hitcost)
status = !status
user << "<span class='notice'>\The [src] is now [status ? "on" : "off"].</span>"
playsound(src.loc, "sparks", 75, 1, -1)
user << "<span class='notice'>[src] is now [status ? "on" : "off"].</span>"
playsound(loc, "sparks", 75, 1, -1)
update_icon()
else
status = 0
user << "<span class='warning'>\The [src] is out of charge.</span>"
if(!bcell)
user << "<span class='warning'>[src] does not have a power source!</span>"
else
user << "<span class='warning'>[src] is out of charge.</span>"
add_fingerprint(user)
/obj/item/weapon/melee/baton/attack(mob/M as mob, mob/user as mob)
/obj/item/weapon/melee/baton/attack(mob/M, mob/user)
if(status && (CLUMSY in user.mutations) && prob(50))
user << "<span class='danger'>You accidentally hit yourself with the [src]!</span>"
user << "span class='danger'>You accidentally hit yourself with the [src]!</span>"
user.Weaken(30)
charges--
if(charges < 1)
status = 0
update_icon()
deductcharge(hitcost)
return
var/mob/living/carbon/human/H = M
if(isrobot(M))
..()
return
var/mob/living/carbon/human/H = M
if(user.a_intent == "hurt")
if(!..()) return
//H.apply_effect(5, WEAKEN, 0)
H.visible_message("<span class='danger'>[M] has been beaten with the [src] by [user]!</span>")
user.attack_log += "\[[time_stamp()]\]<font color='red'> Beat [H.name] ([H.ckey]) with [src.name]</font>"
@@ -68,41 +119,56 @@
msg_admin_attack("[user.name] ([user.ckey]) beat [H.name] ([H.ckey]) with [src.name] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
playsound(src.loc, "swing_hit", 50, 1, -1)
else if(!status)
H.visible_message("<span class='warning'>[M] has been prodded with the [src] by [user]. Luckily it was off.</span>")
H.visible_message("<span class='warning'>[H] has been prodded with [src] by [user]. Luckily it was off.</span>")
return
var/stunroll = (rand(1,100))
if(status)
H.apply_effect(10, STUN, 0)
H.apply_effect(10, WEAKEN, 0)
H.apply_effect(10, STUTTER, 0)
user.lastattacked = M
user.lastattacked = H
H.lastattacker = user
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
R.cell.use(50)
else
charges--
H.visible_message("<span class='danger'>[M] has been stunned with the [src] by [user]!</span>")
if(user == H) // Attacking yourself can't miss
stunroll = 100
if(stunroll < 40)
H.visible_message("\red <B>[user] misses [H] with \the [src]!")
msg_admin_attack("[key_name(user)] attempted to stun [key_name(H)] with the [src].")
return
H.Stun(stunforce)
H.Weaken(stunforce)
H.apply_effect(STUTTER, stunforce)
H.visible_message("<span class='danger'>[H] has been stunned with [src] by [user]!</span>")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with the [src].")
user.attack_log += "\[[time_stamp()]\]<font color='red'> Stunned [H.name] ([H.ckey]) with [src.name]</font>"
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by [user.name] ([user.ckey]) with [src.name]</font>"
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name]")
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
if(charges < 1)
status = 0
update_icon()
add_fingerprint(user)
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
if(R && R.cell)
R.cell.use(hitcost)
else
deductcharge(hitcost)
/obj/item/weapon/melee/baton/emp_act(severity)
switch(severity)
if(1)
charges = 0
if(2)
charges = max(0, charges - 5)
if(charges < 1)
status = 0
update_icon()
if(bcell)
deductcharge(1000 / severity)
if(bcell.reliability != 100 && prob(50/severity))
bcell.reliability -= 10 / severity
..()
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/weapon/melee/baton/cattleprod
name = "stunprod"
desc = "An improvised stun baton."
icon_state = "stunprod_nocell"
item_state = "prod"
force = 3
throwforce = 5
stunforce = 5
hitcost = 2500
slot_flags = null
+24 -1
View File
@@ -179,4 +179,27 @@
if(wielded)
return 1
else
return 0
return 0
//spears, bay edition
/obj/item/weapon/twohanded/spear
icon_state = "spearglass0"
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
force = 14
w_class = 4.0
slot_flags = SLOT_BACK
force_unwielded = 14
force_wielded = 22 // Was 13, Buffed - RR
throwforce = 20
throw_speed = 3
edge = 1
sharp = 1
flags = NOSHIELD
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
/obj/item/weapon/twohanded/spear/update_icon()
icon_state = "spearglass[wielded]"
return
+140 -1
View File
@@ -152,4 +152,143 @@
force = 20
throwforce = 15
w_class = 3
attack_verb = list("jabbed","stabbed","ripped")
attack_verb = list("jabbed","stabbed","ripped")
/obj/item/weapon/baseballbat
name = "wooden bat"
desc = "HOME RUN!"
icon_state = "woodbat"
item_state = "woodbat"
sharp = 0
edge = 0
w_class = 3
force = 15
throw_speed = 3
throw_range = 7
throwforce = 7
attack_verb = list("smashed", "beaten", "slammed", "smacked", "striked", "battered", "bonked")
hitsound = 'sound/weapons/genhit3.ogg'
/obj/item/weapon/baseballbat/metal
name = "metal bat"
desc = "A shiny metal bat."
icon_state = "metalbat"
item_state = "metalbat"
force = 18
w_class = 3.0
/obj/item/weapon/butterfly
name = "butterfly knife"
desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket."
icon_state = "butterflyknife"
item_state = null
hitsound = null
var/active = 0
w_class = 2
force = 2
sharp = 0
edge = 0
throw_speed = 3
throw_range = 4
throwforce = 7
attack_verb = list("patted", "tapped")
/obj/item/butterflyconstruction
name = "unfinished concealed knife"
desc = "An unfinished concealed knife, it looks like the screws need to be tightened."
icon = 'icons/obj/buildingobject.dmi'
icon_state = "butterflystep1"
/obj/item/butterflyconstruction/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/screwdriver))
user << "You finish the concealed blade weapon."
new /obj/item/weapon/butterfly(user.loc)
del(src)
return
/obj/item/butterflyblade
name = "knife blade"
desc = "A knife blade. Unusable as a weapon without a grip."
icon = 'icons/obj/buildingobject.dmi'
icon_state = "butterfly2"
matter = list("metal" = 5000)
/obj/item/butterflyhandle
name = "concealed knife grip"
desc = "A plasteel grip with screw fittings for a blade."
icon = 'icons/obj/buildingobject.dmi'
icon_state = "butterfly1"
matter = list("metal" = 4000)
/obj/item/butterflyhandle/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/butterflyblade))
user << "You attach the two concealed blade parts."
new /obj/item/butterflyconstruction(user.loc)
del(W)
del(src)
return
update_icon(user)
/obj/item/weapon/butterfly/switchblade
name = "/proper switchblade"
desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster."
icon_state = "switchblade"
/obj/item/weapon/butterfly/attack_self(mob/user)
active = !active
if(active)
user << "<span class='notice'>You flip out your [src].</span>"
playsound(user, 'sound/weapons/flipblade.ogg', 15, 1)
force = 15 //bay adjustments
throwforce = 12
edge = 1
sharp = 1
hitsound = 'sound/weapons/bladeslice.ogg'
icon_state += "_open"
w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
else
user << "<span class='notice'>The butterfly knife can now be concealed.</span>"
force = initial(force)
edge = 0
sharp = 0
hitsound = initial(hitsound)
icon_state = initial(icon_state)
w_class = initial(w_class)
attack_verb = initial(attack_verb)
add_fingerprint(user)
obj/item/weapon/wirerod
name = "wired rod"
desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
icon_state = "wiredrod"
item_state = "rods"
flags = CONDUCT
force = 8
throwforce = 10
w_class = 3
attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob)
..()
if(istype(I, /obj/item/weapon/shard))
var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear
user.put_in_hands(S)
user << "<span class='notice'>You fasten the glass shard to the top of the rod with the cable.</span>"
del(I)
del(src)
update_icon(user)
else if(istype(I, /obj/item/weapon/wirecutters))
var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
user.put_in_hands(P)
user << "<span class='notice'>You fasten the wirecutters to the top of the rod with the cable, prongs outward.</span>"
del(I)
del(src)
update_icon(user)
update_icon(user)
@@ -119,7 +119,7 @@
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/melee/baton(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/clothing/tie/holster/waist(src)
new /obj/item/weapon/melee/telebaton(src)
@@ -157,7 +157,7 @@
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/melee/baton(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/weapon/storage/box/holobadge(src)
return
@@ -189,7 +189,7 @@
new /obj/item/device/flash(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/melee/baton(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
@@ -71,7 +71,9 @@
"You hear metal clanking")
unbuckle()
src.add_fingerprint(user)
return
return 1
return 0
/obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob)
if (!ticker)
@@ -112,6 +114,18 @@
icon_state = "down"
anchored = 0
/obj/structure/stool/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/roller_holder))
if(buckled_mob)
manual_unbuckle()
else
visible_message("[user] collapses \the [src.name].")
new/obj/item/roller(get_turf(src))
spawn(0)
del(src)
return
..()
/obj/item/roller
name = "roller bed"
desc = "A collapsed roller bed that can be carried around."
@@ -119,11 +133,47 @@
icon_state = "folded"
w_class = 4.0 // Can't be put in backpacks. Oh well.
attack_self(mob/user)
/obj/item/roller/attack_self(mob/user)
var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc)
R.add_fingerprint(user)
del(src)
/obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/roller_holder))
var/obj/item/roller_holder/RH = W
if(!RH.held)
user << "\blue You collect the roller bed."
src.loc = RH
RH.held = src
return
..()
/obj/item/roller_holder
name = "roller bed rack"
desc = "A rack for carrying a collapsed roller bed."
icon = 'icons/obj/rollerbed.dmi'
icon_state = "folded"
var/obj/item/roller/held
/obj/item/roller_holder/New()
..()
held = new /obj/item/roller(src)
/obj/item/roller_holder/attack_self(mob/user as mob)
if(!held)
user << "\blue The rack is empty."
return
user << "\blue You deploy the roller bed."
var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc)
R.add_fingerprint(user)
del(held)
held = null
/obj/structure/stool/bed/roller/Move()
..()
if(buckled_mob)
@@ -138,7 +138,7 @@
if(propelled)
var/mob/living/occupant = buckled_mob
unbuckle()
occupant.throw_at(A, 3, 2)
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, 0)
occupant.apply_effect(6, WEAKEN, 0)
occupant.apply_effect(6, STUTTER, 0)
@@ -136,7 +136,12 @@
if(propelled || (pulling && (pulling.a_intent == "hurt")))
var/mob/living/occupant = buckled_mob
unbuckle()
occupant.throw_at(A, 3, 2)
if (pulling && (pulling.a_intent == "hurt"))
occupant.throw_at(A, 3, 3, pulling)
else if (propelled)
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, 0)
occupant.apply_effect(6, WEAKEN, 0)
occupant.apply_effect(6, STUTTER, 0)
+15 -14
View File
@@ -370,20 +370,21 @@
else if (istype(O, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = O
if (B.charges > 0 && B.status == 1)
flick("baton_active", src)
user.Stun(10)
user.stuttering = 10
user.Weaken(10)
if(isrobot(user))
var/mob/living/silicon/robot/R = user
R.cell.charge -= 20
else
B.charges--
user.visible_message( \
"[user] was stunned by his wet [O].", \
"\red You have wet \the [O], it shocks you!")
return
if(B.bcell)
if(B.bcell.charge > 0 && B.status == 1)
flick("baton_active", src)
user.Stun(10)
user.stuttering = 10
user.Weaken(10)
if(isrobot(user))
var/mob/living/silicon/robot/R = user
R.cell.charge -= 20
else
B.deductcharge(B.hitcost)
user.visible_message( \
"<span class='danger'>[user] was stunned by \his wet [O]!</span>", \
"<span class='userdanger'>[user] was stunned by \his wet [O]!</span>")
return
var/turf/location = user.loc
if(!isturf(location)) return
+21 -4
View File
@@ -25,13 +25,26 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur
var/mob/M = P
if(!M || !M.client)
continue
if(get_dist(M, turf_source) <= world.view + extrarange)
var/distance = get_dist(M, turf_source)
if(distance <= (world.view + extrarange) * 3)
var/turf/T = get_turf(M)
if(T && T.z == turf_source.z)
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff)
//check that the air can transmit sound
var/datum/gas_mixture/environment = T.return_air()
if (!environment || environment.return_pressure() < SOUND_MINIMUM_PRESSURE)
if (distance > 1)
continue
var/new_frequency = 32000 + (frequency - 32000)*0.125 //lower the frequency. very rudimentary
var/new_volume = vol*0.15 //muffle the sound, like we're hearing through contact
M.playsound_local(turf_source, soundin, new_volume, vary, new_frequency, falloff)
else
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff)
var/const/FALLOFF_SOUNDS = 1
var/const/SURROUND_CAP = 7
var/const/FALLOFF_SOUNDS = 2
var/const/SURROUND_CAP = 255
/mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff)
if(!src.client || ear_deaf > 0) return
@@ -41,6 +54,7 @@ var/const/SURROUND_CAP = 7
S.wait = 0 //No queue
S.channel = 0 //Any channel
S.volume = vol
S.environment = 2
if (vary)
if(frequency)
@@ -51,6 +65,9 @@ var/const/SURROUND_CAP = 7
if(isturf(turf_source))
// 3D sounds, the technology is here!
var/turf/T = get_turf(src)
S.volume -= get_dist(T, turf_source) * 0.75
if (S.volume < 0)
S.volume = 0
var/dx = turf_source.x - T.x // Hearing from the right/left
S.x = round(max(-SURROUND_CAP, min(SURROUND_CAP, dx)), 1)
+67 -3
View File
@@ -73,8 +73,9 @@ datum/preferences
var/r_eyes = 0 //Eye color
var/g_eyes = 0 //Eye color
var/b_eyes = 0 //Eye color
var/species = "Human"
var/species = "Human" //Species datum to use.
var/language = "None" //Secondary language
var/list/gear //Custom/fluff item loadout.
//Mob preview
var/icon/preview_icon = null
@@ -104,7 +105,6 @@ datum/preferences
// maps each organ to either null(intact), "cyborg" or "amputated"
// will probably not be able to do this for head and torso ;)
var/list/organ_data = list()
var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
var/flavor_text = ""
@@ -132,6 +132,8 @@ datum/preferences
gender = pick(MALE, FEMALE)
real_name = random_name(gender)
gear = list()
/datum/preferences
proc/ZeroSkills(var/forced = 0)
for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
@@ -264,7 +266,27 @@ datum/preferences
if(config.allow_Metadata)
dat += "<b>OOC Notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'> Edit </a><br>"
dat += "<br><b>Occupation Choices</b><br>"
dat += "<br><b>Custom Loadout:</b> "
var/total_cost = 0
if(isnull(gear) || !islist(gear)) gear = list()
if(gear && gear.len)
dat += "<br>"
for(var/gear_name in gear)
if(gear_datums[gear_name])
var/datum/gear/G = gear_datums[gear_name]
total_cost += G.cost
dat += "[gear_name] <a href='byond://?src=\ref[user];preference=loadout;task=remove;gear=[gear_name]'>\[remove\]</a><br>"
dat += "<b>Used:</b> [total_cost] points."
else
dat += "none."
if(total_cost < MAX_GEAR_COST)
dat += " <a href='byond://?src=\ref[user];preference=loadout;task=input'>\[add\]</a>"
dat += "<br><br><b>Occupation Choices</b><br>"
dat += "\t<a href='?_src_=prefs;preference=job;task=menu'><b>Set Preferences</b></a><br>"
dat += "<br><table><tr><td><b>Body</b> "
@@ -835,6 +857,48 @@ datum/preferences
ShowChoices(user)
return 1
else if (href_list["preference"] == "loadout")
if(href_list["task"] == "input")
var/list/valid_gear_choices = list()
for(var/gear_name in gear_datums)
var/datum/gear/G = gear_datums[gear_name]
if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted))
continue
valid_gear_choices += gear_name
var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices
if(choice && gear_datums[choice])
var/total_cost = 0
if(isnull(gear) || !islist(gear)) gear = list()
if(gear && gear.len)
for(var/gear_name in gear)
if(gear_datums[gear_name])
var/datum/gear/G = gear_datums[gear_name]
total_cost += G.cost
var/datum/gear/C = gear_datums[choice]
total_cost += C.cost
if(C && total_cost <= MAX_GEAR_COST)
gear += choice
user << "\blue Added [choice] for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)."
else
user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points."
else if(href_list["task"] == "remove")
var/to_remove = href_list["gear"]
if(!to_remove) return
for(var/gear_name in gear)
if(gear_name == to_remove)
gear -= gear_name
break
switch(href_list["task"])
if("random")
switch(href_list["preference"])
+407
View File
@@ -0,0 +1,407 @@
var/global/list/gear_datums = list()
proc/populate_gear_list()
for(var/type in typesof(/datum/gear)-/datum/gear)
var/datum/gear/G = new type()
gear_datums[G.display_name] = G
/datum/gear
var/display_name //Name/index.
var/path //Path to item.
var/cost //Number of points used.
var/slot //Slot to equip to.
var/list/allowed_roles //Roles that can spawn with this item.
var/whitelisted //Term to check the whitelist for..
//Standard gear datums.
/datum/gear/cards
display_name = "deck of cards"
path = /obj/item/weapon/deck
cost = 2
/datum/gear/dice
display_name = "d20"
path = /obj/item/weapon/dice/d20
cost = 1
/datum/gear/comb
display_name = "purple comb"
path = /obj/item/weapon/fluff/cado_keppel_1
cost = 1
/datum/gear/tie_horrible
display_name = "horrible tie"
path = /obj/item/clothing/tie/horrible
cost = 2
/datum/gear/tie_blue
display_name = "blue tie"
path = /obj/item/clothing/tie/blue
cost = 2
/datum/gear/tie_red
display_name = "red tie"
path = /obj/item/clothing/tie/red
cost = 2
/datum/gear/hairflower
display_name = "hair flower pin"
path = /obj/item/clothing/head/hairflower
cost = 2
slot = slot_head
/datum/gear/bandana
display_name = "pirate bandana"
path = /obj/item/clothing/head/bandana
cost = 3
slot = slot_head
/datum/gear/overalls
display_name = "overalls"
path = /obj/item/clothing/suit/apron/overalls
cost = 2
slot = slot_wear_suit
/datum/gear/wcoat
display_name = "waistcoat"
path = /obj/item/clothing/suit/wcoat
cost = 2
slot = slot_wear_suit
/datum/gear/prescription
display_name = "prescription sunglasses"
path = /obj/item/clothing/glasses/sunglasses/prescription
cost = 3
slot = slot_glasses
/datum/gear/eyepatch
display_name = "eyepatch"
path = /obj/item/clothing/glasses/eyepatch
cost = 3
slot = slot_glasses
/datum/gear/flatcap
display_name = "flat cap"
path = /obj/item/clothing/head/flatcap
cost = 2
slot = slot_head
/datum/gear/labcoat
display_name = "labcoat"
path = /obj/item/clothing/suit/storage/labcoat
cost = 3
slot = slot_wear_suit
/datum/gear/sandal
display_name = "sandals"
path = /obj/item/clothing/shoes/sandal
cost = 1
slot = slot_shoes
/datum/gear/leather
display_name = "leather shoes"
path = /obj/item/clothing/shoes/leather
cost = 2
slot = slot_shoes
/datum/gear/dress_shoes
display_name = "dress shoes"
path = /obj/item/clothing/shoes/centcom
cost = 2
slot = slot_shoes
/datum/gear/black_gloves
display_name = "black gloves"
path = /obj/item/clothing/gloves/black
cost = 1
slot = slot_gloves
/datum/gear/red_gloves
display_name = "red gloves"
path = /obj/item/clothing/gloves/red
cost = 1
slot = slot_gloves
/datum/gear/blue_gloves
display_name = "blue gloves"
path = /obj/item/clothing/gloves/blue
cost = 1
slot = slot_gloves
/datum/gear/orange_gloves
display_name = "orange gloves"
path = /obj/item/clothing/gloves/orange
cost = 1
slot = slot_gloves
/datum/gear/purple_gloves
display_name = "purple gloves"
path = /obj/item/clothing/gloves/purple
cost = 1
slot = slot_gloves
/datum/gear/brown_gloves
display_name = "brown gloves"
path = /obj/item/clothing/gloves/brown
cost = 1
slot = slot_gloves
/datum/gear/green_gloves
display_name = "green gloves"
path = /obj/item/clothing/gloves/green
cost = 2
slot = slot_gloves
/datum/gear/white_gloves
display_name = "white gloves"
path = /obj/item/clothing/gloves/white
cost = 2
slot = slot_gloves
/datum/gear/black_shoes
display_name = "black shoes"
path = /obj/item/clothing/shoes/black
cost = 2
slot = slot_shoes
/datum/gear/blue_shoes
display_name = "blue shoes"
path = /obj/item/clothing/shoes/blue
cost = 2
slot = slot_shoes
/datum/gear/brown_shoes
display_name = "brown shoes"
path = /obj/item/clothing/shoes/brown
cost = 2
slot = slot_shoes
/datum/gear/green_shoes
display_name = "green shoes"
path = /obj/item/clothing/shoes/green
cost = 2
slot = slot_shoes
/datum/gear/orange_shoes
display_name = "orange shoes"
path = /obj/item/clothing/shoes/orange
cost = 2
slot = slot_shoes
/datum/gear/purple_shoes
display_name = "purple shoes"
path = /obj/item/clothing/shoes/purple
cost = 2
slot = slot_shoes
/datum/gear/red_shoes
display_name = "red shoes"
path = /obj/item/clothing/shoes/red
cost = 2
slot = slot_shoes
/datum/gear/white_shoes
display_name = "white shoes"
path = /obj/item/clothing/shoes/white
cost = 2
slot = slot_shoes
/datum/gear/yellow_shoes
display_name = "yellow shoes"
path = /obj/item/clothing/shoes/yellow
cost = 2
slot = slot_shoes
/datum/gear/jackboots
display_name = "jackboots"
path = /obj/item/clothing/shoes/jackboots
cost = 3
slot = slot_shoes
/datum/gear/webbing
display_name = "webbing"
path = /obj/item/clothing/tie/storage/webbing
cost = 1
/datum/gear/armband
display_name = "red armband"
path = /obj/item/clothing/tie/armband
cost = 1
/datum/gear/armband_cargo
display_name = "cargo armband"
path = /obj/item/clothing/tie/armband/cargo
cost = 1
/datum/gear/armband_engineering
display_name = "engineering armband"
path = /obj/item/clothing/tie/armband/engine
cost = 1
/datum/gear/armband_science
display_name = "science armband"
path = /obj/item/clothing/tie/armband/science
cost = 1
/datum/gear/armband_hydroponics
display_name = "hydroponics armband"
path = /obj/item/clothing/tie/armband/hydro
cost = 1
/datum/gear/armband_medical
display_name = "medical armband"
path = /obj/item/clothing/tie/armband/med
cost = 1
/datum/gear/armband_emt
display_name = "EMT armband"
path = /obj/item/clothing/tie/armband/medgreen
cost = 1
/datum/gear/skirt_blue
display_name = "blue plaid skirt"
path = /obj/item/clothing/under/dress/plaid_blue
slot = slot_w_uniform
cost = 3
/datum/gear/skirt_red
display_name = "red plaid skirt"
path = /obj/item/clothing/under/dress/plaid_red
slot = slot_w_uniform
cost = 3
/datum/gear/skirt_purple
display_name = "purple plaid skirt"
path = /obj/item/clothing/under/dress/plaid_purple
slot = slot_w_uniform
cost = 3
/datum/gear/skirt_black
display_name = "black skirt"
path = /obj/item/clothing/under/blackskirt
slot = slot_w_uniform
cost = 3
/datum/gear/sundress
display_name = "sundress"
path = /obj/item/clothing/under/sundress
slot = slot_w_uniform
cost = 3
/datum/gear/uniform_captain
display_name = "captain's dress uniform"
path = /obj/item/clothing/under/dress/dress_cap
slot = slot_w_uniform
cost = 3
allowed_roles = list("Captain")
/datum/gear/uniform_hop
display_name = "HoP dress uniform"
path = /obj/item/clothing/under/dress/dress_hop
slot = slot_w_uniform
cost = 3
allowed_roles = list("Head of Personnel")
/datum/gear/uniform_hr
display_name = "HR director uniform"
path = /obj/item/clothing/under/dress/dress_hr
slot = slot_w_uniform
cost = 3
allowed_roles = list("Head of Personnel")
/datum/gear/kilt
display_name = "kilt"
path = /obj/item/clothing/under/kilt
slot = slot_w_uniform
cost = 3
/datum/gear/exec_suit
display_name = "executive suit"
path = /obj/item/clothing/under/suit_jacket/really_black
slot = slot_w_uniform
cost = 3
//Security
/datum/gear/security
display_name = "Security HUD"
path = /obj/item/clothing/glasses/hud/security
cost = 3
slot = slot_glasses
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/black_vest
display_name = "black webbing vest"
path = /obj/item/clothing/tie/storage/black_vest
cost = 3
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/armpit
display_name = "shoulder holster"
path = /obj/item/clothing/tie/holster/armpit
cost = 3
allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security")
/datum/gear/sec_beret
display_name = "security beret"
path = /obj/item/clothing/head/beret/sec
cost = 1
slot = slot_head
allowed_roles = list("Security Officer","Head of Security","Warden")
//Engineering
/datum/gear/eng_beret
display_name = "engineering beret"
path = /obj/item/clothing/head/beret/eng
cost = 1
slot = slot_head
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
/datum/gear/brown_vest
display_name = "brown webbing vest"
path = /obj/item/clothing/tie/storage/brown_vest
cost = 3
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
/datum/gear/engineer_bandana
display_name = "engineering bandana"
path = /obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1
cost = 2
slot = slot_head
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
//Science
/datum/gear/scanning_goggles
display_name = "scanning goggles"
path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1
cost = 2
allowed_roles = list("Roboticist", "Scientist", "Research Director")
//Species-specific gear datums.
/datum/gear/zhan_furs
display_name = "Zhan-Khazan furs"
path = /obj/item/clothing/suit/tajaran/furs
cost = 3
slot = slot_wear_suit
whitelisted = "Tajaran"
/datum/gear/zhan_scarf
display_name = "Zhan-Khazan headscarf"
path = /obj/item/clothing/head/tajaran/scarf
cost = 2
slot = slot_head
whitelisted = "Tajaran"
/datum/gear/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
cost = 3
slot = slot_wear_suit
whitelisted = "Unathi"
/datum/gear/unathi_mantle
display_name = "hide mantle"
path = /obj/item/clothing/suit/unathi/mantle
cost = 2
slot = slot_wear_suit
whitelisted = "Unathi"
@@ -155,6 +155,7 @@
S["skills"] >> skills
S["skill_specialization"] >> skill_specialization
S["organ_data"] >> organ_data
S["gear"] >> gear
S["nanotrasen_relation"] >> nanotrasen_relation
//S["skin_style"] >> skin_style
@@ -211,6 +212,7 @@
if(isnull(disabilities)) disabilities = 0
if(!player_alt_titles) player_alt_titles = new()
if(!organ_data) src.organ_data = list()
if(!gear) src.gear = list()
//if(!skin_style) skin_style = "Default"
return 1
@@ -248,6 +250,7 @@
S["undershirt"] << undershirt
S["backbag"] << backbag
S["b_type"] << b_type
S["spawnpoint"] << spawnpoint
//Jobs
S["alternate_option"] << alternate_option
@@ -273,6 +276,7 @@
S["skills"] << skills
S["skill_specialization"] << skill_specialization
S["organ_data"] << organ_data
S["gear"] << gear
S["nanotrasen_relation"] << nanotrasen_relation
//S["skin_style"] << skin_style
+1 -1
View File
@@ -3,7 +3,7 @@
/obj/item/clothing/head/chefhat
name = "chef's hat"
desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work."
icon_state = "chef"
icon_state = "chefhat"
item_state = "chefhat"
desc = "The commander in chef's head wear."
flags = FPRINT | TABLEPASS
+15 -1
View File
@@ -12,4 +12,18 @@
desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle."
icon_state = "mantle-unathi"
item_state = "mantle-unathi"
body_parts_covered = UPPER_TORSO
body_parts_covered = UPPER_TORSO
//Taj clothing.
/obj/item/clothing/suit/tajaran/furs
name = "heavy furs"
desc = "A traditional Zhan-Khazan garment."
icon_state = "zhan_furs"
item_state = "zhan_furs"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/head/tajaran/scarf
name = "headscarf"
desc = "A scarf of coarse fabric. Seems to have ear-holes."
icon_state = "zhan_scarf"
+2 -2
View File
@@ -294,13 +294,13 @@
/obj/item/clothing/under/dress/dress_cap
name = "captain dress uniform"
name = "captain's dress uniform"
desc = "Feminine fashion for the style concious captain."
icon_state = "dress_cap"
item_color = "dress_cap"
/obj/item/clothing/under/dress/dress_hop
name = "head of personal dress uniform"
name = "head of personnel dress uniform"
desc = "Feminine fashion for the style concious HoP."
icon_state = "dress_hop"
item_color = "dress_hop"
+23 -23
View File
@@ -22,7 +22,7 @@
has_suit = S
loc = has_suit
has_suit.overlays += inv_overlay
user << "<span class='notice'>You attach [src] to [has_suit].</span>"
src.add_fingerprint(user)
@@ -157,38 +157,38 @@
item_color = "red"
/obj/item/clothing/tie/armband/cargo
name = "cargo bay guard armband"
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown."
name = "cargo armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown."
icon_state = "cargo"
item_color = "cargo"
/obj/item/clothing/tie/armband/engine
name = "engineering guard armband"
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!"
name = "engineering armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is orange with a reflective strip!"
icon_state = "engie"
item_color = "engie"
/obj/item/clothing/tie/armband/science
name = "science guard armband"
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple."
name = "science armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is purple."
icon_state = "rnd"
item_color = "rnd"
/obj/item/clothing/tie/armband/hydro
name = "hydroponics guard armband"
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue."
name = "hydroponics armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is green and blue."
icon_state = "hydro"
item_color = "hydro"
/obj/item/clothing/tie/armband/med
name = "medical guard armband"
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white."
name = "medical armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is white."
icon_state = "med"
item_color = "med"
/obj/item/clothing/tie/armband/medgreen
name = "medical guard armband"
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and green."
name = "EMT armband"
desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green."
icon_state = "medgreen"
item_color = "medgreen"
@@ -208,16 +208,16 @@
if(holstered)
user << "\red There is already a [holstered] holstered here!"
return
if (!istype(I, /obj/item/weapon/gun))
user << "\red Only guns can be holstered!"
return
var/obj/item/weapon/gun/W = I
if (!can_holster(W))
user << "\red This [W] won't fit in the [src]!"
return
holstered = W
user.drop_from_inventory(holstered)
holstered.loc = src
@@ -227,7 +227,7 @@
/obj/item/clothing/tie/holster/proc/unholster(mob/user as mob)
if(!holstered)
return
if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj))
user << "\red You need an empty hand to draw the [holstered]!"
else
@@ -246,7 +246,7 @@
if (holstered)
unholster(user)
return
..(user)
/obj/item/clothing/tie/holster/attackby(obj/item/W as obj, mob/user as mob)
@@ -280,7 +280,7 @@
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
var/obj/item/clothing/tie/holster/H = null
if (istype(src, /obj/item/clothing/tie/holster))
H = src
@@ -288,7 +288,7 @@
var/obj/item/clothing/under/S = src
if (S.hastie)
H = S.hastie
if (!H)
usr << "/red Something is very wrong."
@@ -330,14 +330,14 @@
if (has_suit) //if we are part of a suit
hold.open(user)
return
if (hold.handle_attack_hand(user)) //otherwise interact as a regular storage item
..(user)
/obj/item/clothing/tie/storage/MouseDrop(obj/over_object as obj)
if (has_suit)
return
if (hold.handle_mousedrop(usr, over_object))
..(over_object)
@@ -471,6 +471,6 @@
"/obj/item/weapon/kitchen/utensil/pknife",\
"/obj/item/weapon/kitchenknife",\
"/obj/item/weapon/kitchenknife/ritual")
new /obj/item/weapon/hatchet/unathiknife(hold)
new /obj/item/weapon/hatchet/unathiknife(hold)
+71 -19
View File
@@ -492,37 +492,89 @@
new_icon = "earth"
allowed_types = list("ripley","firefighter")
///////// Salvage crew hardsuit - Cybele Petit - solaruin ///////////////
// Root hardsuit kit defines.
// Icons for modified hardsuits need to be in the proper .dmis because suit cyclers may cock them up.
/obj/item/device/kit/suit/fluff
/obj/item/device/kit/fluff/salvage
name = "salvage hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit into a salvage hardsuit."
name = "hardsuit modification kit"
desc = "A kit for modifying a hardsuit."
icon = 'icons/obj/custom_items.dmi'
icon_state = "salvage_kit"
var/new_name // Modifier for new item name - '[new_name] hardsuit'.
var/new_helmet_desc // Sets helmet desc.
var/new_suit_desc // Sets suit desc.
var/helmet_icon // Sets helmet icon_state and item_state.
var/suit_icon // Sets suit icon_state and item_state.
var/helmet_color // Sets item_color.
var/uses = 2 // Uses before the kit deletes itself.
/obj/item/clothing/head/helmet/space/rig/attackby(var/obj/item/O as obj, mob/user as mob)
..()
if(istype(O,/obj/item/device/kit/fluff/salvage))
name = "Salvage Hardsuit helmet"
desc = "An orange hardsuit helmet used by salvage flotillas. Has reinforced plating."
icon = 'icons/obj/custom_items.dmi'
icon_state = "salvage_helmet"
item_state = "salvage_helmet"
if(istype(O,/obj/item/device/kit/suit/fluff))
var/obj/item/device/kit/suit/fluff/kit = O
name = "[kit.new_name] hardsuit helmet"
desc = kit.new_helmet_desc
icon_state = kit.helmet_icon
item_state = kit.helmet_icon
item_color = kit.helmet_color
user << "You set about modifying the helmet into [src]."
playsound(user.loc, 'sound/items/Screwdriver.ogg', 50, 1)
kit.uses--
if(kit.uses<1)
user.drop_item()
del(O)
/obj/item/clothing/suit/space/rig/attackby(var/obj/item/O as obj, mob/user as mob)
..()
if(istype(O,/obj/item/device/kit/fluff/salvage))
name = "Salvage Hardsuit"
desc = "An orange hardsuit used by salvage flotillas. Has reinforced plating."
icon = 'icons/obj/custom_items.dmi'
icon_state = "salvage_suit"
item_state = "salvage_suit"
if(istype(O,/obj/item/device/kit/suit/fluff))
var/obj/item/device/kit/suit/fluff/kit = O
name = "[kit.new_name] hardsuit"
desc = kit.new_suit_desc
icon_state = kit.suit_icon
item_state = kit.suit_icon
user << "You set about modifying the suit into [src]."
playsound(user.loc, 'sound/items/Screwdriver.ogg', 50, 1)
kit.uses--
if(kit.uses<1)
user.drop_item()
del(O)
///////// Salvage crew hardsuit - Cybele Petit - solaruin ///////////////
/obj/item/device/kit/suit/fluff/salvage
name = "salvage hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit into a salvage hardsuit."
new_name = "salvage"
new_suit_desc = "An orange hardsuit used by salvage flotillas. Has reinforced plating."
new_helmet_desc = "An orange hardsuit helmet used by salvage flotillas. Has reinforced plating."
helmet_icon = "salvage_helmet"
suit_icon = "salvage_suit"
helmet_color = "salvage"
///////// Salvage crew hardsuit - Callum Leamas - roaper ///////////////
/obj/item/device/kit/suit/fluff/roaper
name = "Callum's hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit."
new_name = "weathered"
new_suit_desc = " A jury-rigged and modified engineering hardsuit. It looks slightly damaged and dinged."
new_helmet_desc = "A jury-rigged and modified engineering hardsuit helmet. It looks slightly damaged and dinged"
helmet_icon = "rig0-roaper"
suit_icon = "rig-roaper"
helmet_color = "roaper"
//////// Meat Hook - Korom Bhararaya - Matthew951 ////////////////////////
/obj/item/device/kit/fluff/hook
/obj/item/device/kit/weapon/fluff/hook
name = "hook modification kit"
desc = "A kit containing all the needed tools and parts to modify a knife or a butcher's knife into a hook."
icon = 'icons/obj/custom_items.dmi'
@@ -531,7 +583,7 @@
/obj/item/weapon/kitchenknife/attackby(var/obj/item/O as obj, mob/user as mob)
..()
if(istype(O,/obj/item/device/kit/fluff/hook))
if(istype(O,/obj/item/device/kit/weapon/fluff/hook))
name = "meat hook"
desc = "A sharp, metal hook what sticks into things."
icon = 'icons/obj/custom_items.dmi'
@@ -541,7 +593,7 @@
/obj/item/weapon/butch/attackby(var/obj/item/O as obj, mob/user as mob)
..()
if(istype(O,/obj/item/device/kit/fluff/hook))
if(istype(O,/obj/item/device/kit/weapon/fluff/hook))
name = "meat hook"
desc = "A sharp, metal hook what sticks into things."
icon = 'icons/obj/custom_items.dmi'
+11 -11
View File
@@ -13,7 +13,7 @@
I said no!
/datum/recipe/syntitelebacon
items = list(
/obj/item/weapon/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/device/assembly/signaler
)
result = /obj/item/weapon/reagent_containers/food/snacks/telebacon
@@ -128,7 +128,7 @@ I said no!
/datum/recipe/syntiburger
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/syntiflesh
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeyburger
@@ -252,9 +252,9 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
@@ -437,8 +437,8 @@ I said no!
/datum/recipe/syntikabob
items = list(
/obj/item/stack/rods,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob
@@ -533,7 +533,7 @@ I said no!
/datum/recipe/syntisteak
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
items = list(
/obj/item/weapon/syntiflesh
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh
)
result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak
@@ -562,9 +562,9 @@ I said no!
/datum/recipe/syntipizza
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
)
+1 -1
View File
@@ -116,7 +116,7 @@
H.concealed = 1
H.update_icon()
usr.visible_message("\The [usr] deals a card to \the [M].")
H.throw_at(get_step(M,M.dir),10,1)
H.throw_at(get_step(M,M.dir),10,1,H)
/obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/weapon/hand))
@@ -75,9 +75,6 @@ Deep minerals:
//Halfassed diamond-square algorithm with some fuckery since it's a single dimension array.
/datum/ore_distribution/proc/populate_distribution_map()
//Announce it!
world << "<b><font color='red'>Generating resource distribution map.</b></font>"
//Seed beginning values.
var/x = 1
var/y = 1
+11 -8
View File
@@ -142,10 +142,20 @@
/obj/machinery/mineral/processing_unit/process()
if (!active || !src.output || !src.input) return
if (!src.output || !src.input) return
var/list/tick_alloys = list()
//Grab some more ore to process this tick.
for(var/i = 0,i<sheets_per_tick,i++)
var/obj/item/weapon/ore/O = locate() in input.loc
if(!O) break
if(!isnull(ores_stored[O.oretag])) ores_stored[O.oretag]++
O.loc = null
if(!active)
return
//Process our stored ores and spit out sheets.
var/sheets = 0
for(var/metal in ores_stored)
@@ -221,11 +231,4 @@
else
continue
//Grab some more ore to process next tick.
for(var/i = 0,i<sheets_per_tick,i++)
var/obj/item/weapon/ore/O = locate() in input.loc
if(!O) break
if(!isnull(ores_stored[O.oretag])) ores_stored[O.oretag]++
O.loc = null
console.updateUsrDialog()
@@ -107,6 +107,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(stat == CONSCIOUS)
icon_state = "[initial(icon_state)]"
Attach(hit_atom)
throwing = 0
/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
if( (!iscorgi(M) && !iscarbon(M)) || isalien(M))
@@ -1,2 +1,3 @@
/mob/living/carbon/brain/Login()
return ..()
..()
sleeping = 0
+1 -1
View File
@@ -330,7 +330,7 @@
*/
item.throw_at(target, item.throw_range, item.throw_speed)
item.throw_at(target, item.throw_range, item.throw_speed, src)
/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
@@ -58,7 +58,6 @@
dizziness = 0
jitteriness = 0
hud_updateflag |= 1 << HEALTH_HUD
hud_updateflag |= 1 << STATUS_HUD
@@ -117,8 +116,6 @@
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
return ..(gibbed)
/mob/living/carbon/human/proc/makeSkeleton()
if(SKELETON in src.mutations) return
@@ -66,8 +66,10 @@
return custom_emote(m_type, message)
if ("me")
if(silent)
return
//if(silent && silent > 0 && findtext(message,"\"",1, null) > 0)
// return //This check does not work and I have no idea why, I'm leaving it in for reference.
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "\red You cannot send IC messages (muted)."
+37 -1
View File
@@ -1383,7 +1383,7 @@
status_flags |= LEAPING
src.visible_message("<span class='warning'><b>\The [src]</b> leaps at [T]!</span>")
src.throw_at(get_step(get_turf(T),get_turf(src)), 5, 1)
src.throw_at(get_step(get_turf(T),get_turf(src)), 5, 1, src)
playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1)
sleep(5)
@@ -1457,3 +1457,39 @@
M.apply_damage(50,BRUTE)
if(M.stat == 2)
M.gib()
/mob/living/carbon/human/proc/commune()
set category = "IC"
set name = "Commune with creature"
set desc = "Send a telepathic message to an unlucky recipient."
var/list/targets = list()
var/target = null
var/text = null
targets += getmobs() //Fill list, prompt user with list
target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets
if(!target) return
text = input("What would you like to say?", "Speak to creature", null, null)
text = trim(copytext(sanitize(text), 1, MAX_MESSAGE_LEN))
if(!text) return
var/mob/M = targets[target]
if(istype(M, /mob/dead/observer) || M.stat == DEAD)
src << "Not even a [src.species.name] can speak to the dead."
return
log_say("[key_name(src)] communed to [key_name(M)]: [text]")
M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]"
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.name == src.species.name)
return
H << "\red Your nose begins to bleed..."
H.drip(1)
@@ -136,7 +136,7 @@
//Rearranged, so claws don't increase weaken chance.
if(damage >= 5 && prob(50))
visible_message("\red <B>[M] has weakened [src]!</B>")
apply_effect(2, WEAKEN, armor_block)
apply_effect(3, WEAKEN, armor_block)
damage += attack.damage
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge)
@@ -174,7 +174,7 @@
var/randn = rand(1, 100)
if (randn <= 25)
apply_effect(4, WEAKEN, run_armor_check(affecting, "melee"))
apply_effect(3, WEAKEN, run_armor_check(affecting, "melee"))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("\red <B>[M] has pushed [src]!</B>")
return
@@ -307,7 +307,8 @@ This function restores all organs.
var/embed_threshold = sharp? 5*W.w_class : 15*W.w_class
//Sharp objects will always embed if they do enough damage.
if((sharp && damage > (10*W.w_class)) || (sharp && !ismob(W.loc)) || (damage > embed_threshold && prob(embed_chance)))
//Thrown objects have some momentum already and have a small chance to embed even if the damage is below the threshold
if((sharp && damage > (10*W.w_class)) || (sharp && !ismob(W.loc) && prob(damage/(10*W.w_class)*100)) || (damage > embed_threshold && prob(embed_chance)))
organ.embed(W)
return 1
@@ -275,13 +275,84 @@ emp_act
if("chest")//Easier to score a stun but lasts less time
if(prob((I.force + 10)))
apply_effect(5, WEAKEN, armor)
apply_effect(6, WEAKEN, armor)
visible_message("\red <B>[src] has been knocked down!</B>")
if(bloody)
bloody_body(src)
return 1
//this proc handles being hit by a thrown atom
/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5)
if(istype(AM,/obj/))
var/obj/O = AM
var/dtype = BRUTE
if(istype(O,/obj/item/weapon))
var/obj/item/weapon/W = O
dtype = W.damtype
var/throw_damage = O.throwforce*(speed/5)
var/zone
if (istype(O.thrower, /mob/living))
var/mob/living/L = O.thrower
zone = check_zone(L.zone_sel.selecting)
else
zone = ran_zone("chest",75) //Hits a random part of the body, geared towards the chest
//check if we hit
if (O.throw_source)
var/distance = get_dist(O.throw_source, loc)
zone = get_zone_with_miss_chance(zone, src, min(15*(distance-2), 0))
else
zone = get_zone_with_miss_chance(zone, src, 15)
if(!zone)
visible_message("\blue \The [O] misses [src] narrowly!")
return
O.throwing = 0 //it hit, so stop moving
if ((O.thrower != src) && check_shields(throw_damage, "[O]"))
return
var/datum/organ/external/affecting = get_organ(zone)
var/hit_area = affecting.display_name
src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
if(armor < 2)
apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
if(ismob(O.thrower))
var/mob/M = O.thrower
var/client/assailant = M.client
if(assailant)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
// Begin BS12 momentum-transfer code.
if(O.throw_source && speed >= 15)
var/obj/item/weapon/W = O
var/momentum = speed/2
var/dir = get_dir(O.throw_source, src)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
if(!W || !src) return
if(W.loc == src && W.sharp) //Projectile is embedded and suitable for pinning.
var/turf/T = near_wall(dir,2)
if(T)
src.loc = T
visible_message("<span class='warning'>[src] is pinned to the wall by [O]!</span>","<span class='warning'>You are pinned to the wall by [O]!</span>")
src.anchored = 1
src.pinned += O
/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2)
if (gloves)
gloves.add_blood(source)
@@ -690,6 +690,7 @@
loc_temp = environment.temperature
if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1 && environment.phoron < MOLES_PHORON_VISIBLE)
pressure_alert = 0
return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
//Body temperature adjusts depending on surrounding atmosphere based on your thermal protection
@@ -1098,6 +1099,9 @@
return //TODO: DEFERRED
proc/handle_regular_status_updates()
if(status_flags & GODMODE) return 0
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
blinded = 1
silent = 0
@@ -214,6 +214,7 @@
/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
H.verbs += /mob/living/carbon/human/proc/gut
H.verbs += /mob/living/carbon/human/proc/commune
..()
/datum/species/vox/armalis
+46 -35
View File
@@ -65,58 +65,69 @@
P.on_hit(src, absorb, def_zone)
return absorb
//this proc handles being hit by a thrown atom
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve
if(istype(AM,/obj/))
var/obj/O = AM
var/zone = ran_zone("chest",75)//Hits a random part of the body, geared towards the chest
var/dtype = BRUTE
if(istype(O,/obj/item/weapon))
var/obj/item/weapon/W = O
dtype = W.damtype
var/throw_damage = O.throwforce*(speed/5)
var/miss_chance = 15
if (O.throw_source)
var/distance = get_dist(O.throw_source, loc)
miss_chance = min(15*(distance-2), 0)
if (prob(miss_chance))
visible_message("\blue \The [O] misses [src] narrowly!")
return
src.visible_message("\red [src] has been hit by [O].")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].")
var/armor = run_armor_check(null, "melee")
if(armor < 2)
apply_damage(O.throwforce*(speed/5), dtype, zone, armor, is_sharp(O), has_edge(O), O)
apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O)
if(!O.fingerprintslast)
return
O.throwing = 0 //it hit, so stop moving
if(ismob(O.thrower))
var/mob/M = O.thrower
var/client/assailant = M.client
if(assailant)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
var/client/assailant = directory[ckey(O.fingerprintslast)]
if(assailant && assailant.mob && istype(assailant.mob,/mob))
var/mob/M = assailant.mob
// Begin BS12 momentum-transfer code.
if(O.throw_source && speed >= 15)
var/obj/item/weapon/W = O
var/momentum = speed/2
var/dir = get_dir(O.throw_source, src)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a thrown [O], last touched by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a thrown [O], last touched by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
// Begin BS12 momentum-transfer code.
if(!W || !src) return
if(W.sharp) //Projectile is suitable for pinning.
//Handles embedding for non-humans and simple_animals.
O.loc = src
src.embedded += O
if(speed >= 15)
var/obj/item/weapon/W = O
var/momentum = speed/2
var/dir = get_dir(M,src)
var/turf/T = near_wall(dir,2)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
if(!W || !src) return
if(istype(W.loc,/mob/living) && W.sharp) //Projectile is embedded and suitable for pinning.
if(!istype(src,/mob/living/carbon/human)) //Handles embedding for non-humans and simple_animals.
O.loc = src
src.embedded += O
var/turf/T = near_wall(dir,2)
if(T)
src.loc = T
visible_message("<span class='warning'>[src] is pinned to the wall by [O]!</span>","<span class='warning'>You are pinned to the wall by [O]!</span>")
src.anchored = 1
src.pinned += O
if(T)
src.loc = T
visible_message("<span class='warning'>[src] is pinned to the wall by [O]!</span>","<span class='warning'>You are pinned to the wall by [O]!</span>")
src.anchored = 1
src.pinned += O
//This is called when the mob is thrown into a dense turf
/mob/living/proc/turf_collision(var/turf/T, var/speed)
src.take_organ_damage(speed*5)
/mob/living/proc/near_wall(var/direction,var/distance=1)
var/turf/T = get_step(get_turf(src),direction)
+1 -2
View File
@@ -1,4 +1,3 @@
#define SAY_MINIMUM_PRESSURE 10
var/list/department_radio_keys = list(
":r" = "right ear", "#r" = "right ear", ".r" = "right ear",
":l" = "left ear", "#l" = "left ear", ".l" = "left ear",
@@ -112,7 +111,7 @@ var/list/department_radio_keys = list(
var/datum/gas_mixture/environment = T.return_air()
if(environment)
var/pressure = environment.return_pressure()
if(pressure < SAY_MINIMUM_PRESSURE)
if(pressure < SOUND_MINIMUM_PRESSURE)
italics = 1
message_range = 1
+1
View File
@@ -1,4 +1,5 @@
/mob/living/silicon/Login()
sleeping = 0
if(mind && ticker && ticker.mode)
ticker.mode.remove_cultist(mind, 1)
ticker.mode.remove_revolutionary(mind, 1)
@@ -28,6 +28,19 @@
//Item currently being held.
var/obj/item/wrapped = null
/obj/item/weapon/gripper/paperwork
name = "paperwork gripper"
desc = "A simple grasping tool for clerical work."
icon = 'icons/obj/device.dmi'
icon_state = "gripper"
can_hold = list(
/obj/item/weapon/clipboard,
/obj/item/weapon/paper,
/obj/item/weapon/paper_bundle,
/obj/item/weapon/card/id
)
/obj/item/weapon/gripper/attack_self(mob/user as mob)
if(wrapped)
wrapped.attack_self(user)
+33 -5
View File
@@ -5,7 +5,7 @@
icon_state = "robot"
maxHealth = 200
health = 200
var/sight_mode = 0
var/custom_name = ""
var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best
@@ -163,7 +163,7 @@
/mob/living/silicon/robot/proc/pick_module()
if(module)
return
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
var/list/modules = list("Standard", "Engineering", "Construction", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security")
if(crisis && security_level == SEC_LEVEL_RED) //Leaving this in until it's balanced appropriately.
src << "\red Crisis mode active. Combat module available."
modules+="Combat"
@@ -189,6 +189,14 @@
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
if("Clerical")
module = new /obj/item/weapon/robot_module/clerical(src)
module_sprites["Waitress"] = "Service"
module_sprites["Kent"] = "toiletbot"
module_sprites["Bro"] = "Brobot"
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
module.channels = list("Supply" = 1)
@@ -198,15 +206,26 @@
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
if("Medical")
module = new /obj/item/weapon/robot_module/medical(src)
if("Crisis")
module = new /obj/item/weapon/robot_module/crisis(src)
module.channels = list("Medical" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("Medical")
module_sprites["Basic"] = "Medbot"
module_sprites["Standard"] = "surgeon"
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
if("Surgeon")
module = new /obj/item/weapon/robot_module/surgeon(src)
module.channels = list("Medical" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("Medical")
module_sprites["Basic"] = "Medbot"
module_sprites["Standard"] = "surgeon"
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
if("Security")
module = new /obj/item/weapon/robot_module/security(src)
@@ -225,6 +244,15 @@
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
if("Construction")
module = new /obj/item/weapon/robot_module/construction(src)
module.channels = list("Engineering" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("Engineering")
module_sprites["Basic"] = "Engineering"
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
if("Janitor")
module = new /obj/item/weapon/robot_module/janitor(src)
module_sprites["Basic"] = "JanBot2"
@@ -238,7 +266,7 @@
//languages
module.add_languages(src)
//Custom_sprite check and entry
if (custom_sprite == 1)
module_sprites["Custom"] = "[src.ckey]-[modtype]"
@@ -95,14 +95,26 @@
var/mode = 1
/obj/item/weapon/pen/robopen/attack_self(mob/user as mob)
var/choice = input("Would you like to change colour or mode?") as null|anything in list("Colour","Mode")
if(!choice) return
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
if (mode == 1)
mode = 2
user << "Changed printing mode to 'Rename Paper'"
return
if (mode == 2)
mode = 1
user << "Changed printing mode to 'Write Paper'"
switch(choice)
if("Colour")
var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow")
if(newcolour) colour = newcolour
if("Mode")
if (mode == 1)
mode = 2
else
mode = 1
user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'"
return
// Copied over from paper's rename verb
// see code\modules\paperwork\paper.dm line 62
@@ -120,6 +132,33 @@
add_fingerprint(user)
return
//TODO: Add prewritten forms to dispense when you work out a good way to store the strings.
/obj/item/weapon/form_printer
//name = "paperwork printer"
name = "paper dispenser"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paper_bin1"
item_state = "sheet-metal"
/obj/item/weapon/form_printer/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
return
/obj/item/weapon/form_printer/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
if(!target || !flag)
return
if(istype(target,/obj/structure/table))
deploy_paper(get_turf(target))
/obj/item/weapon/form_printer/attack_self(mob/user as mob)
deploy_paper(get_turf(src))
/obj/item/weapon/form_printer/proc/deploy_paper(var/turf/T)
T.visible_message("\blue \The [src.loc] dispenses a sheet of crisp white paper.")
new /obj/item/weapon/paper(T)
//Personal shielding for the combat module.
/obj/item/borg/combat/shield
name = "personal shielding"
@@ -9,6 +9,7 @@
var/list/modules = list()
var/obj/item/emag = null
var/obj/item/borg/upgrade/jetpack = null
var/list/stacktypes
emp_act(severity)
if(modules)
@@ -31,7 +32,21 @@
/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R)
return
if(!stacktypes || !stacktypes.len) return
for(var/T in stacktypes)
var/O = locate(T) in src.modules
var/obj/item/stack/S = O
if(!S)
src.modules -= null
S = new T(src)
src.modules += S
S.amount = 1
if(S && S.amount < stacktypes[T])
S.amount++
/obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module
var/list/temp_list = modules
@@ -42,21 +57,22 @@
/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R)
//full set of languages
R.add_language("Sol Common", 0)
R.add_language("Sol Common", 1)
R.add_language("Tradeband", 1)
R.add_language("Sinta'unathi", 0)
R.add_language("Siik'maas", 0)
R.add_language("Siik'tajr", 0)
R.add_language("Skrellian", 0)
R.add_language("Tradeband", 0)
R.add_language("Gutter", 0)
/obj/item/weapon/robot_module/standard
name = "standard robot module"
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/melee/baton(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
@@ -64,13 +80,49 @@
src.emag = new /obj/item/weapon/melee/energy/sword(src)
return
/obj/item/weapon/robot_module/standard/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/melee/baton/B = locate() in src.modules
if(B.charges < 10)
B.charges += 1
/obj/item/weapon/robot_module/surgeon
name = "surgeon robot module"
stacktypes = list(
/obj/item/stack/medical/advanced/bruise_pack = 5,
/obj/item/stack/nanopaste = 5
)
/obj/item/weapon/robot_module/medical
name = "medical robot module"
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src)
src.modules += new /obj/item/weapon/scalpel(src)
src.modules += new /obj/item/weapon/hemostat(src)
src.modules += new /obj/item/weapon/retractor(src)
src.modules += new /obj/item/weapon/cautery(src)
src.modules += new /obj/item/weapon/bonegel(src)
src.modules += new /obj/item/weapon/bonesetter(src)
src.modules += new /obj/item/weapon/circular_saw(src)
src.modules += new /obj/item/weapon/surgicaldrill(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src)
src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src)
src.modules += new /obj/item/stack/nanopaste(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("pacid", 250)
src.emag.name = "Polyacid spray"
return
/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R)
if(src.emag)
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
PS.reagents.add_reagent("pacid", 2)
..()
/obj/item/weapon/robot_module/crisis
name = "crisis robot module"
stacktypes = list(
/obj/item/stack/medical/ointment = 5,
/obj/item/stack/medical/bruise_pack = 5,
/obj/item/stack/medical/splint = 5
)
New()
src.modules += new /obj/item/device/flashlight(src)
@@ -78,40 +130,74 @@
src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)
src.modules += new /obj/item/roller_holder(src)
src.modules += new /obj/item/stack/medical/ointment(src)
src.modules += new /obj/item/stack/medical/bruise_pack(src)
src.modules += new /obj/item/stack/medical/splint(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("pacid", 250)
src.emag.name = "Polyacid spray"
return
/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
if(S.mode == 2)//SYRINGE_BROKEN
if(S.mode == 2)
S.reagents.clear_reagents()
S.mode = initial(S.mode)
S.desc = initial(S.desc)
S.update_icon()
if(src.emag)
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
PS.reagents.add_reagent("pacid", 2)
/obj/item/weapon/robot_module/engineering
name = "engineering robot module"
..()
/obj/item/weapon/robot_module/construction
name = "construction robot module"
stacktypes = list(
/obj/item/stack/sheet/metal = 50,
/obj/item/stack/sheet/plasteel = 10,
/obj/item/stack/sheet/rglass = 50
)
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
/obj/item/weapon/robot_module/engineering
name = "engineering robot module"
stacktypes = list(
/obj/item/stack/sheet/metal = 50,
/obj/item/stack/sheet/glass = 50,
/obj/item/stack/sheet/rglass = 50,
/obj/item/weapon/cable_coil = 50,
/obj/item/stack/rods = 15,
/obj/item/stack/tile/plasteel = 15
)
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.emag = new /obj/item/borg/stun(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/extinguisher(src)
// src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
@@ -121,12 +207,20 @@
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
src.emag = new /obj/item/borg/stun(src)
var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
M.amount = 50
src.modules += M
var/obj/item/stack/sheet/rglass/cyborg/G = new /obj/item/stack/sheet/rglass/cyborg(src)
var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src)
R.amount = 50
src.modules += R
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src)
G.amount = 50
src.modules += G
@@ -136,24 +230,6 @@
return
/obj/item/weapon/robot_module/engineering/respawn_consumable(var/mob/living/silicon/robot/R)
var/list/stacks = list (
/obj/item/stack/sheet/metal,
/obj/item/stack/sheet/rglass,
/obj/item/weapon/cable_coil,
)
for(var/T in stacks)
var/O = locate(T) in src.modules
if(O)
if(O:amount < 50)
O:amount++
else
src.modules -= null
O = new T(src)
src.modules += O
O:amount = 1
return
/obj/item/weapon/robot_module/security
name = "security robot module"
@@ -162,7 +238,7 @@
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/hud/sec(src)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src)
src.modules += new /obj/item/taperoll/police(src)
src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
@@ -182,9 +258,6 @@
T.update_icon()
else
T.charge_tick = 0
var/obj/item/weapon/melee/baton/B = locate() in src.modules
if(B.charges < 10)
B.charges += 1
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
@@ -217,7 +290,6 @@
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
src.modules += new /obj/item/weapon/pen/robopen(src)
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
@@ -251,6 +323,28 @@
R.add_language("Tradeband", 1)
R.add_language("Gutter", 1)
/obj/item/weapon/robot_module/clerical
name = "clerical robot module"
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/pen/robopen(src)
src.modules += new /obj/item/weapon/form_printer(src)
src.modules += new /obj/item/weapon/gripper/paperwork(src)
src.emag = new /obj/item/weapon/stamp/denied(src)
add_languages(var/mob/living/silicon/robot/R)
R.add_language("Sol Common", 1)
R.add_language("Sinta'unathi", 1)
R.add_language("Siik'maas", 1)
R.add_language("Siik'tajr", 0)
R.add_language("Skrellian", 1)
R.add_language("Rootspeak", 1)
R.add_language("Tradeband", 1)
R.add_language("Gutter", 1)
/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
E.reagents.add_reagent("enzyme", 2)
@@ -265,11 +359,12 @@
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.emag = new /obj/item/borg/stun(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/storage/bag/ore(src)
src.modules += new /obj/item/weapon/pickaxe/borgdrill(src)
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
// src.modules += new /obj/item/weapon/shovel(src) Uneeded due to buffed drill
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
return
/obj/item/weapon/robot_module/syndicate
@@ -301,7 +396,7 @@
/obj/item/weapon/robot_module/drone
name = "drone module"
var/list/stacktypes = list(
stacktypes = list(
/obj/item/stack/sheet/wood/cyborg = 1,
/obj/item/stack/sheet/mineral/plastic/cyborg = 1,
/obj/item/stack/sheet/rglass/cyborg = 5,
@@ -342,29 +437,17 @@
var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules
C.reagents.add_reagent("cleaner", 3)
for(var/T in stacktypes)
var/O = locate(T) in src.modules
var/obj/item/stack/sheet/S = O
if(!S)
src.modules -= null
S = new T(src)
src.modules += S
S.amount = 1
if(S && S.amount < stacktypes[T])
S.amount++
var/obj/item/device/lightreplacer/LR = locate() in src.modules
LR.Charge(R)
..()
return
//checks whether this item is a module of the robot it is located in.
/obj/item/proc/is_robot_module()
if (!istype(src.loc, /mob/living/silicon/robot))
return 0
var/mob/living/silicon/robot/R = src.loc
return (src in R.module.modules)
return (src in R.module.modules)
@@ -1,3 +1,8 @@
/mob/living/silicon/robot/Process_Spaceslipping(var/prob_slip)
if(module && (istype(module,/obj/item/weapon/robot_module/construction) || istype(module,/obj/item/weapon/robot_module/drone)))
return 0
..(prob_slip)
/mob/living/silicon/robot/Process_Spacemove()
if(module)
for(var/obj/item/weapon/tank/jetpack/J in module.modules)
@@ -1,160 +0,0 @@
/mob/living/simple_animal/vox/armalis/
name = "serpentine alien"
real_name = "serpentine alien"
desc = "A one-eyed, serpentine creature, half-machine, easily nine feet from tail to beak!"
icon = 'icons/mob/vox.dmi'
icon_state = "armalis"
icon_living = "armalis"
maxHealth = 500
health = 500
response_harm = "slashes at the"
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 40
attacktext = "slammed its enormous claws into"
speed = -1
wall_smash = 1
attack_sound = 'sound/weapons/bladeslice.ogg'
status_flags = 0
universal_speak = 1
var/armour = null
var/amp = null
var/quills = 3
/mob/living/simple_animal/vox/armalis/Die()
living_mob_list -= src
dead_mob_list += src
stat = DEAD
visible_message("\red <B>[src] shudders violently and explodes!</B>","\red <B>You feel your body rupture!</B>")
explosion(get_turf(loc), -1, -1, 3, 5)
src.gib()
return
/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
if(O.force >= 25)
var/damage = O.force
if (O.damtype == HALLOSS)
damage = 0
health -= damage
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
else
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
else
usr << "\red This weapon is ineffective, it does no damage."
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/vox/armalis/verb/fire_quill(mob/target as mob in oview())
set name = "Fire quill"
set desc = "Fires a viciously pointed quill at a high speed."
set category = "Alien"
if(quills<=0)
return
src << "\red You launch a razor-sharp quill at [target]!"
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << "\red [src] launches a razor-sharp quill at [target]!"
var/obj/item/weapon/arrow/quill/Q = new(loc)
Q.fingerprintslast = src.ckey
Q.throw_at(target,10,30)
quills--
spawn(100)
src << "\red You feel a fresh quill slide into place."
quills++
/mob/living/simple_animal/vox/armalis/verb/message_mob()
set category = "Alien"
set name = "Commune with creature"
set desc = "Send a telepathic message to an unlucky recipient."
var/list/targets = list()
var/target = null
var/text = null
targets += getmobs() //Fill list, prompt user with list
target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets
text = input("What would you like to say?", "Speak to creature", null, null)
if (!target || !text)
return
var/mob/M = targets[target]
if(istype(M, /mob/dead/observer) || M.stat == DEAD)
src << "Not even the armalis can speak to the dead."
return
M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]"
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.name == "Vox")
return
H << "\red Your nose begins to bleed..."
H.drip(1)
/mob/living/simple_animal/vox/armalis/verb/shriek()
set category = "Alien"
set name = "Shriek"
set desc = "Give voice to a psychic shriek."
/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O,/obj/item/vox/armalis_armour))
user.drop_item()
armour = O
speed = 1
maxHealth += 200
health += 200
O.loc = src
visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
regenerate_icons()
return
if(istype(O,/obj/item/vox/armalis_amp))
user.drop_item()
amp = O
O.loc = src
visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
regenerate_icons()
return
return ..()
/mob/living/simple_animal/vox/armalis/regenerate_icons()
overlays = list()
if(armour)
var/icon/armour = image('icons/mob/vox.dmi',"armour")
speed = 1
overlays += armour
if(amp)
var/icon/amp = image('icons/mob/vox.dmi',"amplifier")
overlays += amp
return
/obj/item/vox/armalis_armour
name = "strange armour"
desc = "Hulking reinforced armour for something huge."
icon = 'icons/obj/clothing/suits.dmi'
icon_state = "armalis_armour"
item_state = "armalis_armour"
/obj/item/vox/armalis_amp
name = "strange lenses"
desc = "A series of metallic lenses and chains."
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "amp"
item_state = "amp"
+3 -2
View File
@@ -989,10 +989,11 @@ mob/proc/yank_out_object()
affected = organ
affected.implants -= selection
H.shock_stage+=10
H.shock_stage+=20
H.bloody_hands(S)
affected.take_damage((selection.w_class * 3), 0, 0, 1, "Embedded object extraction")
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-.
if(prob(selection.w_class * 5)) //I'M SO ANEMIC I COULD JUST -DIE-.
var/datum/wound/internal_bleeding/I = new (15)
affected.wounds += I
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
+5 -1
View File
@@ -147,7 +147,11 @@ proc/hasorgans(A)
*/
return zone
// Returns zone with a certain probability.
// If the probability misses, returns "chest" instead.
// If "chest" was passed in as zone, then on a "miss" will return "head", "l_arm", or "r_arm"
// Do not use this if someone is intentionally trying to hit a specific body part.
// Use get_zone_with_miss_chance() for that.
/proc/ran_zone(zone, probability)
zone = check_zone(zone)
if(!probability) probability = 90
+4
View File
@@ -249,6 +249,10 @@
if(istype(mob.buckled, /obj/vehicle))
return mob.buckled.relaymove(mob,direct)
if(istype(mob.machine, /obj/machinery))
if(mob.machine.relaymove(mob,direct))
return
if(mob.pulledby || mob.buckled) // Wheelchair driving!
if(istype(mob.loc, /turf/space))
return // No wheelchair driving in space
+11
View File
@@ -134,6 +134,7 @@
return 1
if(href_list["late_join"])
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
usr << "\red The round is either not ready, or has already finished..."
return
@@ -143,6 +144,11 @@
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
var/datum/species/S = all_species[client.prefs.species]
if(!(S.flags & IS_WHITELISTED))
src << alert("Your current species,[client.prefs.species], is not available for play on the station.")
return 0
LateChoices()
if(href_list["manifest"])
@@ -159,6 +165,11 @@
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
var/datum/species/S = all_species[client.prefs.species]
if(!(S.flags & IS_WHITELISTED))
src << alert("Your current species,[client.prefs.species], is not available for play on the station.")
return 0
AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint)
return
+19 -13
View File
@@ -5,13 +5,30 @@
var/open_uis[0]
// a list of current open /nanoui UIs, not grouped, for use in processing
var/list/processing_uis = list()
// a list of asset filenames which are to be sent to the client on user logon
var/list/asset_files = list()
/**
* Create a new nanomanager instance.
* This proc generates a list of assets which are to be sent to each client on connect
*
* @return /nanomanager new nanomanager object
*/
/datum/nanomanager/New()
var/list/nano_asset_dirs = list(\
"nano/css/",\
"nano/images/",\
"nano/js/",\
"nano/templates/"\
)
var/list/filenames = null
for (var/path in nano_asset_dirs)
filenames = flist(path)
for(var/filename in filenames)
if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
asset_files.Add(file(path + filename)) // add this file to asset_files for sending to clients when they connect
return
/**
@@ -208,17 +225,6 @@
*/
/datum/nanomanager/proc/send_resources(client)
var/list/nano_asset_dirs = list(\
"nano/css/",\
"nano/images/",\
"nano/js/",\
"nano/templates/"\
)
var/list/files = null
for (var/path in nano_asset_dirs)
files = flist(path)
for(var/file in files)
if(copytext(file, length(file)) != "/") // files which end in "/" are actually directories, which we want to ignore
client << browse_rsc(file(path + file)) // send the file to the client
for(var/file in asset_files)
client << browse_rsc(file) // send the file to the client
+7 -1
View File
@@ -32,6 +32,7 @@
var/damage_msg = "\red You feel an intense pain"
var/broken_description
var/vital //Lose a vital limb, die immediately.
var/status = 0
var/open = 0
var/stage = 0
@@ -668,6 +669,9 @@ Note that amputating the affected organ does in fact remove the infection from t
// OK so maybe your limb just flew off, but if it was attached to a pair of cuffs then hooray! Freedom!
release_restraints()
if(vital)
owner.death()
/****************************************************
HELPERS
****************************************************/
@@ -831,7 +835,7 @@ Note that amputating the affected organ does in fact remove the infection from t
max_damage = 75
min_broken_damage = 40
body_part = UPPER_TORSO
vital = 1
/datum/organ/external/groin
name = "groin"
@@ -840,6 +844,7 @@ Note that amputating the affected organ does in fact remove the infection from t
max_damage = 50
min_broken_damage = 30
body_part = LOWER_TORSO
vital = 1
/datum/organ/external/l_arm
name = "l_arm"
@@ -933,6 +938,7 @@ Note that amputating the affected organ does in fact remove the infection from t
min_broken_damage = 40
body_part = HEAD
var/disfigured = 0
vital = 1
/datum/organ/external/head/get_icon()
if (!owner)
@@ -43,7 +43,7 @@
var/obj/item/missile/M = new projectile(user.loc)
playsound(user.loc, 'sound/effects/bang.ogg', 50, 1)
M.primed = 1
M.throw_at(target, missile_range, missile_speed)
M.throw_at(target, missile_range, missile_speed,user)
message_admins("[key_name_admin(user)] fired a rocket from a rocket launcher ([src.name]).")
log_game("[key_name_admin(user)] used a rocket launcher ([src.name]).")
rockets -= I
+1 -1
View File
@@ -56,7 +56,7 @@
var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta!
grenades -= F
F.loc = user.loc
F.throw_at(target, 30, 2)
F.throw_at(target, 30, 2, user)
message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
log_game("[key_name_admin(user)] used a grenade ([src.name]).")
F.active = 1
@@ -18,6 +18,12 @@
var/list/reagent_ids = list("tricordrazine", "inaprovaline", "spaceacillin")
//var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "anti_toxin", "inaprovaline", "spaceacillin")
/obj/item/weapon/reagent_containers/borghypo/surgeon
reagent_ids = list("bicaridine", "inaprovaline", "dexalin")
/obj/item/weapon/reagent_containers/borghypo/crisis
reagent_ids = list("tricordrazine", "inaprovaline", "tramadol")
/obj/item/weapon/reagent_containers/borghypo/New()
..()
for(var/R in reagent_ids)
+8 -6
View File
@@ -123,20 +123,22 @@
shift_light(5, warning_color)
if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
var/stability = num2text(round((damage / explosion_point) * 100))
var/alert_msg
if(damage > emergency_point)
shift_light(7, emergency_color)
radio.autosay(addtext(emergency_alert, " Instability: ",stability,"%"), "Supermatter Monitor")
alert_msg = addtext(emergency_alert, " Instability: ",stability,"%")
lastwarning = world.timeofday
else if(damage >= damage_archived) // The damage is still going up
radio.autosay(addtext(warning_alert," Instability: ",stability,"%"), "Supermatter Monitor")
alert_msg = addtext(warning_alert," Instability: ",stability,"%")
lastwarning = world.timeofday - 150
else // Phew, we're safe
radio.autosay(safe_alert, "Supermatter Monitor")
else // Phew, we're safe
alert_msg = safe_alert
lastwarning = world.timeofday
if(!istype(L, /turf/space) && alert_msg)
radio.autosay(alert_msg, "Supermatter Monitor")
if(damage > explosion_point)
for(var/mob/living/mob in living_mob_list)
if(istype(mob, /mob/living/carbon/human))
+4
View File
@@ -27,6 +27,8 @@
#define HUMAN_NEEDED_OXYGEN MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16
//Amount of air needed before pass out/suffocation commences
#define SOUND_MINIMUM_PRESSURE 10
// Pressure limits.
#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant)
#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE)
@@ -812,3 +814,5 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define IS_VOX 2
#define IS_SKRELL 3
#define IS_UNATHI 4
#define MAX_GEAR_COST 5 //Used in chargen for loadout limit.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Some files were not shown because too many files have changed in this diff Show More