mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-26 21:46:51 +01:00
Merge pull request #3140 from Baystation12/bleeding-edge-freeze
Bleeding edge freeze
This commit is contained in:
+18
-4
@@ -52,7 +52,11 @@
|
||||
#define FILE_DIR "sound/violin"
|
||||
#define FILE_DIR "sound/voice"
|
||||
#define FILE_DIR "sound/voice/Serithi"
|
||||
#define FILE_DIR "sound/vox"
|
||||
#define FILE_DIR "sound/weapons"
|
||||
#define FILE_DIR "tools"
|
||||
#define FILE_DIR "tools/AddToChangelog"
|
||||
#define FILE_DIR "tools/AddToChangelog/AddToChangelog"
|
||||
// END_FILE_DIR
|
||||
// BEGIN_PREFERENCES
|
||||
#define DEBUG
|
||||
@@ -197,6 +201,7 @@
|
||||
#include "code\game\communications.dm"
|
||||
#include "code\game\dna.dm"
|
||||
#include "code\game\hud.dm"
|
||||
#include "code\game\response_team.dm"
|
||||
#include "code\game\shuttle_engines.dm"
|
||||
#include "code\game\skincmd.dm"
|
||||
#include "code\game\smoothwall.dm"
|
||||
@@ -583,6 +588,7 @@
|
||||
#include "code\game\objects\items\weapons\tanks\jetpack.dm"
|
||||
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
|
||||
#include "code\game\objects\items\weapons\tanks\tanks.dm"
|
||||
#include "code\game\objects\random\random.dm"
|
||||
#include "code\game\objects\storage\coat.dm"
|
||||
#include "code\game\objects\structures\barsign.dm"
|
||||
#include "code\game\objects\structures\bedsheet_bin.dm"
|
||||
@@ -707,6 +713,7 @@
|
||||
#include "code\modules\admin\verbs\striketeam_syndicate.dm"
|
||||
#include "code\modules\admin\verbs\ticklag.dm"
|
||||
#include "code\modules\admin\verbs\tripAI.dm"
|
||||
#include "code\modules\admin\verbs\vox_raiders.dm"
|
||||
#include "code\modules\assembly\assembly.dm"
|
||||
#include "code\modules\assembly\bomb.dm"
|
||||
#include "code\modules\assembly\helpers.dm"
|
||||
@@ -726,10 +733,6 @@
|
||||
#include "code\modules\awaymissions\pamphlet.dm"
|
||||
#include "code\modules\awaymissions\trigger.dm"
|
||||
#include "code\modules\awaymissions\zlevel.dm"
|
||||
#include "code\modules\awaymissions\maploader\dmm_suite.dm"
|
||||
#include "code\modules\awaymissions\maploader\reader.dm"
|
||||
#include "code\modules\awaymissions\maploader\swapmaps.dm"
|
||||
#include "code\modules\awaymissions\maploader\writer.dm"
|
||||
#include "code\modules\client\client defines.dm"
|
||||
#include "code\modules\client\client procs.dm"
|
||||
#include "code\modules\client\preferences.dm"
|
||||
@@ -827,6 +830,10 @@
|
||||
#include "code\modules\library\lib_machines.dm"
|
||||
#include "code\modules\library\lib_readme.dm"
|
||||
#include "code\modules\liquid\splash_simulation.dm"
|
||||
#include "code\modules\maps\dmm_suite.dm"
|
||||
#include "code\modules\maps\reader.dm"
|
||||
#include "code\modules\maps\swapmaps.dm"
|
||||
#include "code\modules\maps\writer.dm"
|
||||
#include "code\modules\mining\machine_input_output_plates.dm"
|
||||
#include "code\modules\mining\machine_processing.dm"
|
||||
#include "code\modules\mining\machine_stacking.dm"
|
||||
@@ -979,6 +986,7 @@
|
||||
#include "code\modules\mob\living\silicon\pai\recruit.dm"
|
||||
#include "code\modules\mob\living\silicon\pai\say.dm"
|
||||
#include "code\modules\mob\living\silicon\pai\software.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\component.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\death.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\emote.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\examine.dm"
|
||||
@@ -988,6 +996,7 @@
|
||||
#include "code\modules\mob\living\silicon\robot\life.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\login.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\robot.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
|
||||
@@ -998,6 +1007,7 @@
|
||||
#include "code\modules\mob\living\simple_animal\parrot.dm"
|
||||
#include "code\modules\mob\living\simple_animal\shade.dm"
|
||||
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
|
||||
#include "code\modules\mob\living\simple_animal\vox.dm"
|
||||
#include "code\modules\mob\living\simple_animal\worm.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
|
||||
@@ -1098,7 +1108,9 @@
|
||||
#include "code\modules\projectiles\guns\energy\stun.dm"
|
||||
#include "code\modules\projectiles\guns\energy\temperature.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\automatic.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\bow.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\pistol.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\pneumatic.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\revolver.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
|
||||
#include "code\modules\projectiles\projectile\animate.dm"
|
||||
@@ -1253,6 +1265,7 @@
|
||||
#include "code\WorkInProgress\buildmode.dm"
|
||||
#include "code\WorkInProgress\explosion_particles.dm"
|
||||
#include "code\WorkInProgress\periodic_news.dm"
|
||||
#include "code\WorkInProgress\Apples\artifacts.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\meteor_battery.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\sculpture.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm"
|
||||
@@ -1298,6 +1311,7 @@
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm"
|
||||
#include "code\WorkInProgress\Chinsky\ashtray.dm"
|
||||
#include "code\WorkInProgress\Cib\MedicalSideEffects.dm"
|
||||
#include "code\WorkInProgress\kilakk\responseteam.dm"
|
||||
#include "code\WorkInProgress\Mini\ATM.dm"
|
||||
#include "code\WorkInProgress\Mini\atmos_control.dm"
|
||||
#include "code\WorkInProgress\Ported\policetape.dm"
|
||||
|
||||
@@ -14,7 +14,6 @@ obj/item/changestone/attack_hand(var/mob/user as mob)
|
||||
H.gender = FEMALE
|
||||
H.dna.ready_dna(H)
|
||||
H.update_body()
|
||||
H.update_face()
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
var/list/waypoints = list()
|
||||
for(var/obj/effect/landmark/temple/destination/T in world)
|
||||
waypoints.Add(T)
|
||||
if(!T)
|
||||
return
|
||||
else continue
|
||||
var/obj/effect/landmark/temple/destination/dest_temple = pick(waypoints)
|
||||
dest_temple.init()
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/circuitboard/atmoscontrol
|
||||
name = "\improper Central Atmospherics Computer Circuitboard"
|
||||
build_path = "/obj/machinery/computer/security/atmoscontrol"
|
||||
build_path = /obj/machinery/computer/atmoscontrol
|
||||
|
||||
/obj/machinery/computer/atmoscontrol
|
||||
name = "\improper Central Atmospherics Computer"
|
||||
@@ -297,13 +297,12 @@ Nitrous Oxide
|
||||
output += {"
|
||||
<a href='?src=\ref[src];alarm=\ref[current];screen=[AALARM_SCREEN_MAIN]'>Main menu</a><br>
|
||||
<b>Air machinery mode for the area:</b><ul>"}
|
||||
var/list/modes = list(
|
||||
AALARM_MODE_SCRUBBING = "Filtering",
|
||||
AALARM_MODE_REPLACEMENT = "<font color='red'>REPLACE AIR</font>",
|
||||
AALARM_MODE_PANIC = "<font color='red'>PANIC</font>",
|
||||
AALARM_MODE_CYCLE = "<font color='red'>CYCLE</font>",
|
||||
AALARM_MODE_FILL = "<font color='red'>FILL</font>",\
|
||||
AALARM_MODE_OFF = "<font color='blue'>OFFF</font>",)
|
||||
var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering - Scrubs out contaminants",\
|
||||
AALARM_MODE_REPLACEMENT = "<font color='blue'>Replace Air - Siphons out air while replacing</font>",\
|
||||
AALARM_MODE_PANIC = "<font color='red'>Panic - Siphons air out of the room</font>",\
|
||||
AALARM_MODE_CYCLE = "<font color='red'>Cycle - Siphons air before replacing</font>",\
|
||||
AALARM_MODE_FILL = "<font color='green'>Fill - Shuts off scrubbers and opens vents</font>",\
|
||||
AALARM_MODE_OFF = "<font color='blue'>Off - Shuts off vents and scrubbers</font>",)
|
||||
for (var/m=1,m<=modes.len,m++)
|
||||
if (current.mode==m)
|
||||
output += {"<li><A href='?src=\ref[src];alarm=\ref[current];mode=[m]'><b>[modes[m]]</b></A> (selected)</li>"}
|
||||
|
||||
@@ -98,7 +98,7 @@ var/sent_emergency_team = 0
|
||||
if(L.name == "Response Team")
|
||||
leader_selected = member_number == 1?1:0 // The last person selected will be the leader
|
||||
|
||||
var/mob/living/carbon/human/new_member = create_response_team(L, leader_selected)
|
||||
var/mob/living/carbon/human/new_member = spawn_response_team(L, leader_selected)
|
||||
|
||||
new_member.age = !leader_selected ? rand(23,35) : rand(35,45)
|
||||
|
||||
@@ -188,7 +188,7 @@ var/sent_emergency_team = 0
|
||||
return 1
|
||||
|
||||
// Mob creation
|
||||
/client/proc/create_response_team(obj/spawn_location, leader_selected = 0)
|
||||
/client/proc/spawn_response_team(obj/spawn_location, leader_selected = 0)
|
||||
var/mob/living/carbon/human/new_member = new(spawn_location.loc)
|
||||
|
||||
return new_member
|
||||
|
||||
+44
-39
@@ -158,47 +158,53 @@ connection
|
||||
if(!istype(zone_1) || !istype(zone_2))
|
||||
return
|
||||
|
||||
//Handle disconnection of indirectly or directly connected zones.
|
||||
if( (zone_1 in zone_2.connected_zones) || (zone_2 in zone_1.connected_zones) )
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
//Handle disconnection of indirectly or directly connected zones.
|
||||
if( (zone_1 in zone_2.connected_zones) || (zone_2 in zone_1.connected_zones) )
|
||||
|
||||
//If there are more than one connection, decrement the number of connections
|
||||
//Otherwise, remove all connections between the zones.
|
||||
if(zone_1.connected_zones[zone_2] > 1)
|
||||
zone_1.connected_zones[zone_2]--
|
||||
else
|
||||
zone_1.connected_zones -= zone_2
|
||||
//remove the list if it is empty
|
||||
if(!zone_1.connected_zones.len)
|
||||
zone_1.connected_zones = null
|
||||
//If there are more than one connection, decrement the number of connections
|
||||
//Otherwise, remove all connections between the zones.
|
||||
if(zone_2 in zone_1.connected_zones)
|
||||
if(zone_1.connected_zones[zone_2] > 1)
|
||||
zone_1.connected_zones[zone_2]--
|
||||
else
|
||||
zone_1.connected_zones -= zone_2
|
||||
//remove the list if it is empty
|
||||
if(!zone_1.connected_zones.len)
|
||||
zone_1.connected_zones = null
|
||||
|
||||
//Then do the same for the other zone.
|
||||
if(zone_2.connected_zones[zone_1] > 1)
|
||||
zone_2.connected_zones[zone_1]--
|
||||
else
|
||||
zone_2.connected_zones -= zone_1
|
||||
if(!zone_2.connected_zones.len)
|
||||
zone_2.connected_zones = null
|
||||
//Then do the same for the other zone.
|
||||
if(zone_1 in zone_2.connected_zones)
|
||||
if(zone_2.connected_zones[zone_1] > 1)
|
||||
zone_2.connected_zones[zone_1]--
|
||||
else
|
||||
zone_2.connected_zones -= zone_1
|
||||
if(!zone_2.connected_zones.len)
|
||||
zone_2.connected_zones = null
|
||||
|
||||
//Handle disconnection of closed zones.
|
||||
if( (zone_1 in zone_2.closed_connection_zones) || (zone_2 in zone_1.closed_connection_zones) )
|
||||
else
|
||||
//Handle disconnection of closed zones.
|
||||
if( (zone_1 in zone_2.closed_connection_zones) || (zone_2 in zone_1.closed_connection_zones) )
|
||||
|
||||
//If there are more than one connection, decrement the number of connections
|
||||
//Otherwise, remove all connections between the zones.
|
||||
if(zone_1.closed_connection_zones[zone_2] > 1)
|
||||
zone_1.closed_connection_zones[zone_2]--
|
||||
else
|
||||
zone_1.closed_connection_zones -= zone_2
|
||||
//remove the list if it is empty
|
||||
if(!zone_1.closed_connection_zones.len)
|
||||
zone_1.closed_connection_zones = null
|
||||
//If there are more than one connection, decrement the number of connections
|
||||
//Otherwise, remove all connections between the zones.
|
||||
if(zone_2 in zone_1.connected_zones)
|
||||
if(zone_1.closed_connection_zones[zone_2] > 1)
|
||||
zone_1.closed_connection_zones[zone_2]--
|
||||
else
|
||||
zone_1.closed_connection_zones -= zone_2
|
||||
//remove the list if it is empty
|
||||
if(!zone_1.closed_connection_zones.len)
|
||||
zone_1.closed_connection_zones = null
|
||||
|
||||
//Then do the same for the other zone.
|
||||
if(zone_2.closed_connection_zones[zone_1] > 1)
|
||||
zone_2.closed_connection_zones[zone_1]--
|
||||
else
|
||||
zone_2.closed_connection_zones -= zone_1
|
||||
if(!zone_2.closed_connection_zones.len)
|
||||
zone_2.closed_connection_zones = null
|
||||
//Then do the same for the other zone.
|
||||
if(zone_1 in zone_2.connected_zones)
|
||||
if(zone_2.closed_connection_zones[zone_1] > 1)
|
||||
zone_2.closed_connection_zones[zone_1]--
|
||||
else
|
||||
zone_2.closed_connection_zones -= zone_1
|
||||
if(!zone_2.closed_connection_zones.len)
|
||||
zone_2.closed_connection_zones = null
|
||||
|
||||
|
||||
proc/Cleanup()
|
||||
@@ -255,9 +261,8 @@ connection
|
||||
|
||||
//The door is instead closed.
|
||||
else if(indirect > CONNECTION_CLOSED)
|
||||
indirect = CONNECTION_CLOSED
|
||||
|
||||
DisconnectZones(A.zone, B.zone)
|
||||
indirect = CONNECTION_CLOSED
|
||||
ConnectZones(A.zone, B.zone)
|
||||
|
||||
//If I can no longer pass air, better delete
|
||||
@@ -377,7 +382,7 @@ connection
|
||||
//Handle diconnection and reconnection of zones.
|
||||
if(zone_A && zone_B)
|
||||
DisconnectZones(zone_A, zone_B)
|
||||
ConnectZones(A.zone, B.zone, indirect)
|
||||
ConnectZones(A.zone, B.zone, indirect)
|
||||
|
||||
|
||||
#undef CONNECTION_DIRECT
|
||||
|
||||
@@ -95,6 +95,10 @@ zone/proc
|
||||
|
||||
for(var/turf/space/S in unsimulated_tiles)
|
||||
S.overlays -= 'debug_space.dmi'
|
||||
|
||||
for(var/connection/C in connections)
|
||||
C.A.overlays -= 'debug_connect.dmi'
|
||||
C.B.overlays -= 'debug_connect.dmi'
|
||||
for(var/zone/Z in zones)
|
||||
if(Z.air == air && Z != src)
|
||||
var/turf/zloc = pick(Z.contents)
|
||||
|
||||
+31
-16
@@ -81,28 +81,43 @@ proc/ZMerge(zone/A,zone/B)
|
||||
if(!istype(A) || !istype(B))
|
||||
return
|
||||
|
||||
//Merges two zones so that they are one.
|
||||
var/a_size = A.air.group_multiplier
|
||||
var/b_size = B.air.group_multiplier
|
||||
var/c_size = a_size + b_size
|
||||
var/new_contents = A.contents + B.contents
|
||||
|
||||
//Set air multipliers to one so air represents gas per tile.
|
||||
A.air.group_multiplier = 1
|
||||
B.air.group_multiplier = 1
|
||||
|
||||
//Remove some air proportional to the size of this zone.
|
||||
A.air.remove_ratio(a_size/c_size)
|
||||
B.air.remove_ratio(b_size/c_size)
|
||||
|
||||
//Merge the gases and set the multiplier to the sum of the old ones.
|
||||
A.air.merge(B.air)
|
||||
A.air.group_multiplier = c_size
|
||||
|
||||
//Set all the zone vars.
|
||||
for(var/turf/simulated/T in B.contents)
|
||||
T.zone = A
|
||||
|
||||
if(istype(A.air) && istype(B.air))
|
||||
//Merges two zones so that they are one.
|
||||
var/a_size = A.air.group_multiplier
|
||||
var/b_size = B.air.group_multiplier
|
||||
var/c_size = a_size + b_size
|
||||
|
||||
//Set air multipliers to one so air represents gas per tile.
|
||||
A.air.group_multiplier = 1
|
||||
B.air.group_multiplier = 1
|
||||
|
||||
//Remove some air proportional to the size of this zone.
|
||||
A.air.remove_ratio(a_size/c_size)
|
||||
B.air.remove_ratio(b_size/c_size)
|
||||
|
||||
//Merge the gases and set the multiplier to the sum of the old ones.
|
||||
A.air.merge(B.air)
|
||||
A.air.group_multiplier = c_size
|
||||
|
||||
//I hate when the air datum somehow disappears.
|
||||
// Try to make it sorta work anyways. Fakit
|
||||
else if(istype(B.air))
|
||||
A.air = B.air
|
||||
A.air.group_multiplier = A.contents.len
|
||||
|
||||
else if(istype(A.air))
|
||||
A.air.group_multiplier = A.contents.len
|
||||
|
||||
//Doublefakit.
|
||||
else
|
||||
A.air = new
|
||||
|
||||
//Check for connections to merge into the new zone.
|
||||
for(var/connection/C in B.connections)
|
||||
//The Cleanup proc will delete the connection if the zones are the same.
|
||||
|
||||
+30
-24
@@ -279,7 +279,7 @@ zone/proc/process()
|
||||
unsimulated_boost += unsimulated_tiles.len
|
||||
if(Z.unsimulated_tiles)
|
||||
unsimulated_boost += Z.unsimulated_tiles.len
|
||||
unsimulated_boost = min(3, unsimulated_boost)
|
||||
unsimulated_boost = max(0, min(3, unsimulated_boost))
|
||||
ShareRatio( air , Z.air , connected_zones[Z] + unsimulated_boost)
|
||||
|
||||
for(var/zone/Z in closed_connection_zones)
|
||||
@@ -364,7 +364,7 @@ proc/ShareRatio(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles)
|
||||
if(A.compare(B)) return 1
|
||||
else return 0
|
||||
|
||||
proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles)
|
||||
proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles, dbg_output)
|
||||
//A modified version of ShareRatio for spacing gas at the same rate as if it were going into a large airless room.
|
||||
if(!unsimulated_tiles || !unsimulated_tiles.len)
|
||||
return 0
|
||||
@@ -377,20 +377,6 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles)
|
||||
unsim_heat_capacity = 0
|
||||
unsim_temperature = 0
|
||||
|
||||
for(var/turf/T in unsimulated_tiles)
|
||||
unsim_oxygen += T.oxygen
|
||||
unsim_co2 += T.carbon_dioxide
|
||||
unsim_nitrogen += T.nitrogen
|
||||
unsim_plasma += T.toxins
|
||||
unsim_temperature += T.temperature/unsimulated_tiles.len
|
||||
|
||||
unsim_heat_capacity = HEAT_CAPACITY_CALCULATION(unsim_oxygen,unsim_co2,unsim_nitrogen,unsim_plasma)
|
||||
|
||||
var
|
||||
ratio = sharing_lookup_table[6]
|
||||
|
||||
old_pressure = A.return_pressure()
|
||||
|
||||
size = max(1,A.group_multiplier)
|
||||
|
||||
// We use the same size for the potentially single space tile
|
||||
@@ -399,7 +385,27 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles)
|
||||
// slowly than small rooms, preserving our good old "hollywood-style"
|
||||
// oh-shit effect when large rooms get breached, but still having small
|
||||
// rooms remain pressurized for long enough to make escape possible.
|
||||
share_size = max(1, unsimulated_tiles.len)
|
||||
share_size = max(1, max(size - 5, 1) + unsimulated_tiles.len)
|
||||
correction_ratio = share_size / unsimulated_tiles.len
|
||||
|
||||
for(var/turf/T in unsimulated_tiles)
|
||||
unsim_oxygen += T.oxygen
|
||||
unsim_co2 += T.carbon_dioxide
|
||||
unsim_nitrogen += T.nitrogen
|
||||
unsim_plasma += T.toxins
|
||||
unsim_temperature += T.temperature/unsimulated_tiles.len
|
||||
|
||||
//These values require adjustment in order to properly represent a room of the specified size.
|
||||
unsim_oxygen *= correction_ratio
|
||||
unsim_co2 *= correction_ratio
|
||||
unsim_nitrogen *= correction_ratio
|
||||
unsim_plasma *= correction_ratio
|
||||
unsim_heat_capacity = HEAT_CAPACITY_CALCULATION(unsim_oxygen,unsim_co2,unsim_nitrogen,unsim_plasma)
|
||||
|
||||
var
|
||||
ratio = sharing_lookup_table[6]
|
||||
|
||||
old_pressure = A.return_pressure()
|
||||
|
||||
full_oxy = A.oxygen * size
|
||||
full_nitro = A.nitrogen * size
|
||||
@@ -419,16 +425,16 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles)
|
||||
ratio = sharing_lookup_table[unsimulated_tiles.len]
|
||||
ratio *= 2
|
||||
|
||||
A.oxygen = max(0, (A.oxygen - oxy_avg) * (1-ratio) + oxy_avg )
|
||||
A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1-ratio) + nit_avg )
|
||||
A.carbon_dioxide = max(0, (A.carbon_dioxide - co2_avg) * (1-ratio) + co2_avg )
|
||||
A.toxins = max(0, (A.toxins - plasma_avg) * (1-ratio) + plasma_avg )
|
||||
A.oxygen = max(0, (A.oxygen - oxy_avg) * (1 - ratio) + oxy_avg )
|
||||
A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1 - ratio) + nit_avg )
|
||||
A.carbon_dioxide = max(0, (A.carbon_dioxide - co2_avg) * (1 - ratio) + co2_avg )
|
||||
A.toxins = max(0, (A.toxins - plasma_avg) * (1 - ratio) + plasma_avg )
|
||||
|
||||
A.temperature = max(TCMB, (A.temperature - temp_avg) * (1-ratio) + temp_avg )
|
||||
A.temperature = max(TCMB, (A.temperature - temp_avg) * (1 - ratio) + temp_avg )
|
||||
|
||||
for(var/datum/gas/G in A.trace_gases)
|
||||
var/G_avg = (G.moles*size + 0) / (size+share_size)
|
||||
G.moles = (G.moles - G_avg) * (1-ratio) + G_avg
|
||||
var/G_avg = (G.moles * size) / (size + share_size)
|
||||
G.moles = (G.moles - G_avg) * (1 - ratio) + G_avg
|
||||
|
||||
A.update_values()
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
var/Ticklag = 0.9
|
||||
var/Tickcomp = 0
|
||||
var/socket_talk = 0 // use socket_talk to communicate with other processes
|
||||
var/list/resource_urls = null
|
||||
|
||||
var/list/mode_names = list()
|
||||
var/list/modes = list() // allowed modes
|
||||
@@ -164,6 +165,9 @@
|
||||
|
||||
if(type == "config")
|
||||
switch (name)
|
||||
if ("resource_urls")
|
||||
config.resource_urls = stringsplit(value, " ")
|
||||
|
||||
if ("admin_legacy_system")
|
||||
config.admin_legacy_system = 1
|
||||
|
||||
|
||||
@@ -51,7 +51,8 @@ datum/controller/game_controller/New()
|
||||
datum/controller/game_controller/proc/setup()
|
||||
world.tick_lag = config.Ticklag
|
||||
|
||||
createRandomZlevel()
|
||||
spawn(20)
|
||||
createRandomZlevel()
|
||||
|
||||
if(!air_master)
|
||||
air_master = new /datum/controller/air_system()
|
||||
|
||||
@@ -67,6 +67,7 @@ datum/shuttle_controller
|
||||
captain_announce("The shuttle has been recalled.")
|
||||
setdirection(-1)
|
||||
online = 1
|
||||
alert = 0 // set alert back to 0 after an admin recall
|
||||
return
|
||||
|
||||
// returns the time (in seconds) before shuttle arrival
|
||||
|
||||
@@ -10,6 +10,7 @@ datum/controller/vote
|
||||
var/list/voted = list()
|
||||
var/list/voting = list()
|
||||
var/list/current_votes = list()
|
||||
var/auto_muted = 0
|
||||
|
||||
New()
|
||||
if(vote != src)
|
||||
@@ -53,6 +54,14 @@ datum/controller/vote
|
||||
voting.Cut()
|
||||
current_votes.Cut()
|
||||
|
||||
if(auto_muted && !ooc_allowed)
|
||||
auto_muted = 0
|
||||
ooc_allowed = !( ooc_allowed )
|
||||
world << "<b>The OOC channel has been automatically enabled due to vote cancellation.</b>"
|
||||
log_admin("OOC was toggled automatically due to vote cancellation.")
|
||||
message_admins("OOC has been toggled on automatically.")
|
||||
|
||||
|
||||
proc/get_result()
|
||||
//get the highest number of votes
|
||||
var/greatest_votes = 0
|
||||
@@ -138,6 +147,12 @@ datum/controller/vote
|
||||
if("crew_transfer")
|
||||
if(. == "Initiate Crew Transfer")
|
||||
init_shift_change(null, 1)
|
||||
if(auto_muted && !ooc_allowed)
|
||||
auto_muted = 0
|
||||
ooc_allowed = !( ooc_allowed )
|
||||
world << "<b>The OOC channel has been automatically enabled due to vote end.</b>"
|
||||
log_admin("OOC was toggled automatically due to vote end.")
|
||||
message_admins("OOC has been toggled on automatically.")
|
||||
|
||||
|
||||
if(restart)
|
||||
@@ -202,14 +217,35 @@ datum/controller/vote
|
||||
world << "<font color='purple'><b>[text]</b>\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.</font>"
|
||||
switch(vote_type)
|
||||
if("crew_transfer")
|
||||
world << sound('sound/voice/Serithi/Shuttlehere.ogg')
|
||||
world << sound('sound/ambience/alarm4.ogg')
|
||||
if("gamemode")
|
||||
world << sound('sound/voice/Serithi/pretenddemoc.ogg')
|
||||
world << sound('sound/ambience/alarm4.ogg')
|
||||
if("custom")
|
||||
world << sound('sound/voice/Serithi/weneedvote.ogg')
|
||||
world << sound('sound/ambience/alarm4.ogg')
|
||||
if(mode == "gamemode" && going)
|
||||
going = 0
|
||||
world << "<font color='red'><b>Round start has been delayed.</b></font>"
|
||||
if(mode == "crew_transfer" && ooc_allowed)
|
||||
auto_muted = 1
|
||||
ooc_allowed = !( ooc_allowed )
|
||||
world << "<b>The OOC channel has been automatically disabled due to the crew transfer vote.</b>"
|
||||
log_admin("OOC was toggled automatically due to crew_transfer vote.")
|
||||
message_admins("OOC has been toggled off automatically.")
|
||||
if(mode == "gamemode" && ooc_allowed)
|
||||
auto_muted = 1
|
||||
ooc_allowed = !( ooc_allowed )
|
||||
world << "<b>The OOC channel has been automatically disabled due to the gamemode vote.</b>"
|
||||
log_admin("OOC was toggled automatically due to gamemode vote.")
|
||||
message_admins("OOC has been toggled off automatically.")
|
||||
if(mode == "custom" && ooc_allowed)
|
||||
auto_muted = 1
|
||||
ooc_allowed = !( ooc_allowed )
|
||||
world << "<b>The OOC channel has been automatically disabled due to the custom vote.</b>"
|
||||
log_admin("OOC was toggled automatically due to custom vote.")
|
||||
message_admins("OOC has been toggled off automatically.")
|
||||
|
||||
|
||||
|
||||
|
||||
time_remaining = round(config.vote_period/10)
|
||||
return 1
|
||||
|
||||
@@ -122,9 +122,10 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
|
||||
icobase = 'icons/mob/human_races/r_lizard.dmi'
|
||||
if("Skrell")
|
||||
icobase = 'icons/mob/human_races/r_skrell.dmi'
|
||||
|
||||
if("Vox")
|
||||
icobase = 'icons/mob/human_races/r_vox.dmi'
|
||||
if("Kidan")
|
||||
icobase = 'icons/mob/human_races/r_kidan.dmi'
|
||||
|
||||
else
|
||||
icobase = 'icons/mob/human_races/r_human.dmi'
|
||||
|
||||
@@ -730,7 +730,7 @@ client
|
||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
||||
return
|
||||
|
||||
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow","tajaran","skrell","vox")
|
||||
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow","tajaran","skrell","vox","kidan")
|
||||
switch(new_mutantrace)
|
||||
if(null)
|
||||
return
|
||||
|
||||
@@ -1220,5 +1220,9 @@ datum/mind
|
||||
mind.assigned_role = "Juggernaut"
|
||||
mind.special_role = "Cultist"
|
||||
|
||||
/mob/living/simple_animal/vox/armalis/mind_initialize()
|
||||
..()
|
||||
mind.assigned_role = "Armalis"
|
||||
mind.special_role = "Vox Raider"
|
||||
|
||||
|
||||
|
||||
@@ -66,6 +66,29 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containername = "Monkey crate"
|
||||
group = "Hydroponics"
|
||||
|
||||
/datum/supply_packs/farwa
|
||||
name = "Farwa crate"
|
||||
contains = list (/obj/item/weapon/storage/box/farwacubes)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Farwa crate"
|
||||
group = "Hydroponics"
|
||||
|
||||
/datum/supply_packs/skrell
|
||||
name = "Neaera crate"
|
||||
contains = list (/obj/item/weapon/storage/box/neaeracubes)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Neaera crate"
|
||||
group = "Hydroponics"
|
||||
|
||||
/datum/supply_packs/stok
|
||||
name = "Stok crate"
|
||||
contains = list (/obj/item/weapon/storage/box/stokcubes)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Stok crate"
|
||||
group = "Hydroponics"
|
||||
|
||||
/datum/supply_packs/beanbagammo
|
||||
name = "Beanbag shells"
|
||||
|
||||
@@ -310,16 +310,17 @@
|
||||
name = "shard"
|
||||
icon = 'icons/obj/shards.dmi'
|
||||
icon_state = "large"
|
||||
sharp = 1
|
||||
desc = "Could probably be used as ... a throwing weapon?"
|
||||
w_class = 1.0
|
||||
force = 5.0
|
||||
throwforce = 15.0
|
||||
throwforce = 8.0
|
||||
item_state = "shard-glass"
|
||||
g_amt = 3750
|
||||
attack_verb = list("stabbed", "slashed", "sliced", "cut")
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << pick("/red <b>[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.</b>", \
|
||||
viewers(user) << pick("\red <b>[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.</b>", \
|
||||
"\red <b>[user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide.</b>")
|
||||
return (BRUTELOSS)
|
||||
|
||||
@@ -346,6 +347,28 @@
|
||||
m_amt = 100
|
||||
origin_tech = "magnets=2;syndicate=3"*/
|
||||
|
||||
/obj/item/weapon/shard/shrapnel
|
||||
name = "shrapnel"
|
||||
icon = 'icons/obj/shards.dmi'
|
||||
icon_state = "shrapnellarge"
|
||||
desc = "A bunch of tiny bits of shattered metal."
|
||||
|
||||
/obj/item/weapon/shard/shrapnel/New()
|
||||
|
||||
src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall")
|
||||
switch(src.icon_state)
|
||||
if("shrapnelsmall")
|
||||
src.pixel_x = rand(-12, 12)
|
||||
src.pixel_y = rand(-12, 12)
|
||||
if("shrapnelmedium")
|
||||
src.pixel_x = rand(-8, 8)
|
||||
src.pixel_y = rand(-8, 8)
|
||||
if("shrapnellarge")
|
||||
src.pixel_x = rand(-5, 5)
|
||||
src.pixel_y = rand(-5, 5)
|
||||
else
|
||||
return
|
||||
|
||||
/obj/item/weapon/SWF_uplink
|
||||
name = "station-bounced radio"
|
||||
desc = "used to comunicate it appears."
|
||||
@@ -522,7 +545,7 @@
|
||||
icon_state = "hatchet"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
force = 12.0
|
||||
w_class = 1.0
|
||||
w_class = 2.0
|
||||
throwforce = 15.0
|
||||
throw_speed = 4
|
||||
throw_range = 4
|
||||
|
||||
@@ -1003,18 +1003,39 @@ proc/process_ghost_teleport_locs()
|
||||
//MedBay
|
||||
|
||||
/area/medical/medbay
|
||||
name = "Medbay"
|
||||
name = "\improper Medbay"
|
||||
icon_state = "medbay"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
//Medbay is a large area, these additional areas help level out APC load.
|
||||
/area/medical/medbay2
|
||||
name = "Medbay"
|
||||
name = "\improper Medbay"
|
||||
icon_state = "medbay2"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/medbay3
|
||||
name = "Medbay"
|
||||
name = "\improper Medbay"
|
||||
icon_state = "medbay3"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
|
||||
/area/medical/biostorage
|
||||
name = "\improper Secondary Storage"
|
||||
icon_state = "medbay2"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/reception
|
||||
name = "\improper Medbay Reception"
|
||||
icon_state = "medbay"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/psych
|
||||
name = "\improper Psych Room"
|
||||
icon_state = "medbay3"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/medbreak
|
||||
name = "\improper Break Room"
|
||||
icon_state = "medbay3"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
@@ -1022,20 +1043,44 @@ proc/process_ghost_teleport_locs()
|
||||
name = "\improper Patient's Rooms"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/ward
|
||||
name = "\improper Medbay Patient Ward"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/patient_a
|
||||
name = "\improper Isolation A"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/patient_b
|
||||
name = "\improper Isolation B"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/patient_c
|
||||
name = "\improper Isolation C"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/iso_access
|
||||
name = "\improper Isolation Access"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/cmo
|
||||
name = "\improper Chief Medical Officer's office"
|
||||
icon_state = "CMO"
|
||||
|
||||
/area/medical/cmostore
|
||||
name = "\improper Secure Storage"
|
||||
icon_state = "CMO"
|
||||
|
||||
/area/medical/robotics
|
||||
name = "Robotics"
|
||||
name = "\improper Robotics"
|
||||
icon_state = "medresearch"
|
||||
|
||||
/area/medical/research
|
||||
name = "Medical Research"
|
||||
name = "\improper Medical Research"
|
||||
icon_state = "medresearch"
|
||||
|
||||
/area/medical/virology
|
||||
name = "Virology"
|
||||
name = "\improper Virology"
|
||||
icon_state = "virology"
|
||||
|
||||
/area/medical/morgue
|
||||
@@ -1043,15 +1088,19 @@ proc/process_ghost_teleport_locs()
|
||||
icon_state = "morgue"
|
||||
|
||||
/area/medical/chemistry
|
||||
name = "Chemistry"
|
||||
name = "\improper Chemistry"
|
||||
icon_state = "chem"
|
||||
|
||||
/area/medical/surgery
|
||||
name = "Surgery"
|
||||
name = "\improper Surgery"
|
||||
icon_state = "surgery"
|
||||
|
||||
/area/medical/surgeryobs
|
||||
name = "\improper Surgery Observation"
|
||||
icon_state = "surgery"
|
||||
|
||||
/area/medical/cryo
|
||||
name = "Cryogenics"
|
||||
name = "\improper Cryogenics"
|
||||
icon_state = "cryo"
|
||||
|
||||
/area/medical/exam_room
|
||||
@@ -1059,15 +1108,15 @@ proc/process_ghost_teleport_locs()
|
||||
icon_state = "exam_room"
|
||||
|
||||
/area/medical/genetics
|
||||
name = "Genetics Lab"
|
||||
name = "\improper Genetics Lab"
|
||||
icon_state = "genetics"
|
||||
|
||||
/area/medical/genetics_cloning
|
||||
name = "Cloning Lab"
|
||||
name = "\improper Cloning Lab"
|
||||
icon_state = "cloning"
|
||||
|
||||
/area/medical/sleeper
|
||||
name = "Medbay Treatment Center"
|
||||
name = "\improper Emergency"
|
||||
icon_state = "exam_room"
|
||||
|
||||
//Security
|
||||
|
||||
+3
-3
@@ -21,10 +21,10 @@
|
||||
//Detective Work, used for the duplicate data points kept in the scanners
|
||||
var/list/original_atom
|
||||
|
||||
/atom/proc/throw_impact(atom/hit_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)
|
||||
M.hitby(src,speed)
|
||||
|
||||
log_attack("<font color='red'>[hit_atom] ([M.ckey]) was hit by [src] thrown by ([src.fingerprintslast])</font>")
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/obj/O = hit_atom
|
||||
if(!O.anchored)
|
||||
step(O, src.dir)
|
||||
O.hitby(src)
|
||||
O.hitby(src,speed)
|
||||
|
||||
else if(isturf(hit_atom))
|
||||
var/turf/T = hit_atom
|
||||
|
||||
@@ -44,18 +44,18 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/atom/movable/proc/hit_check()
|
||||
/atom/movable/proc/hit_check(var/speed)
|
||||
if(src.throwing)
|
||||
for(var/atom/A in get_turf(src))
|
||||
if(A == src) continue
|
||||
if(istype(A,/mob/living))
|
||||
if(A:lying) continue
|
||||
src.throw_impact(A)
|
||||
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)
|
||||
src.throw_impact(A,speed)
|
||||
src.throwing = 0
|
||||
|
||||
/atom/movable/proc/throw_at(atom/target, range, speed)
|
||||
@@ -97,7 +97,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error += dist_x
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -109,7 +109,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error -= dist_y
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -126,7 +126,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error += dist_y
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -138,7 +138,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error -= dist_x
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
//done throwing, either because it hit something or it finished moving
|
||||
src.throwing = 0
|
||||
if(isobj(src)) src:throw_impact(get_turf(src))
|
||||
if(isobj(src)) src:throw_impact(get_turf(src),speed)
|
||||
|
||||
|
||||
//Overlays
|
||||
|
||||
+11
-1
@@ -548,7 +548,17 @@
|
||||
sleep(48)
|
||||
del(animation)
|
||||
|
||||
var/mob/living/carbon/monkey/O = new(src)
|
||||
|
||||
var/mob/living/carbon/monkey/O = null
|
||||
switch(M.dna.mutantrace)
|
||||
if("tajaran")
|
||||
O = new /mob/living/carbon/monkey/tajara(src)
|
||||
if("lizard")
|
||||
O = new /mob/living/carbon/monkey/unathi(src)
|
||||
if("skrell")
|
||||
O = new /mob/living/carbon/monkey/skrell(src)
|
||||
else
|
||||
O = new /mob/living/carbon/monkey(src)
|
||||
|
||||
if(M)
|
||||
if (M.dna)
|
||||
|
||||
@@ -65,45 +65,11 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
|
||||
s_coold = 1
|
||||
return
|
||||
|
||||
//=======//9-8 TILE TELEPORT//=======//
|
||||
//Click to to teleport 9-10 tiles in direction facing.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
|
||||
set name = "Phase Jaunt (10E)"
|
||||
set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 100
|
||||
if(!ninjacost(C,1))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1)
|
||||
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
|
||||
if(destination&&istype(mobloc, /turf))//The turf check prevents unusual behavior. Like teleporting out of cryo pods, cloners, mechs, etc.
|
||||
spawn(0)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir)
|
||||
|
||||
handle_teleport_grab(destination, U)
|
||||
U.loc = destination
|
||||
|
||||
spawn(0)
|
||||
spark_system.start()
|
||||
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
|
||||
spawn(0)
|
||||
destination.kill_creatures(U)//Any living mobs in teleport area are gibbed. Check turf procs for how it does it.
|
||||
s_coold = 1
|
||||
cell.charge-=(C*10)
|
||||
else
|
||||
U << "\red The VOID-shift device is malfunctioning, <B>teleportation failed</B>."
|
||||
return
|
||||
|
||||
//=======//RIGHT CLICK TELEPORT//=======//
|
||||
//Right click to teleport somewhere, almost exactly like admin jump to turf.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview())
|
||||
set name = "Phase Shift (20E)"
|
||||
set name = "Phase Shift (1E)"
|
||||
set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view."
|
||||
set category = null//So it does not show up on the panel but can still be right-clicked.
|
||||
set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide!
|
||||
@@ -125,11 +91,6 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
|
||||
playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(U.loc, 'sound/effects/sparks2.ogg', 50, 1)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
|
||||
|
||||
spawn(0)//Any living mobs in teleport area are gibbed.
|
||||
T.kill_creatures(U)
|
||||
s_coold = 1
|
||||
cell.charge-=(C*10)
|
||||
else
|
||||
U << "\red You cannot teleport into solid walls or from solid matter"
|
||||
return
|
||||
@@ -137,16 +98,16 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
|
||||
//=======//EM PULSE//=======//
|
||||
//Disables nearby tech equipment.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse()
|
||||
set name = "EM Burst (25E)"
|
||||
set name = "EM Burst (1,000E)"
|
||||
set desc = "Disable any nearby technology with a electro-magnetic pulse."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 250
|
||||
if(!ninjacost(C,1))
|
||||
if(!ninjacost(C,100)) // EMP's now cost 1,000Energy about 30%
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
playsound(U.loc, 'sound/effects/EMPulse.ogg', 60, 2)
|
||||
empulse(U, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch.
|
||||
empulse(U, 2, 3) //Procs sure are nice. Slightly weaker than wizard's disable tch.
|
||||
s_coold = 2
|
||||
cell.charge-=(C*10)
|
||||
return
|
||||
@@ -154,13 +115,13 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
|
||||
//=======//ENERGY BLADE//=======//
|
||||
//Summons a blade of energy in active hand.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjablade()
|
||||
set name = "Energy Blade (5E)"
|
||||
set name = "Energy Blade (20E)"
|
||||
set desc = "Create a focused beam of energy in your active hand."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 50
|
||||
if(!ninjacost(C))
|
||||
if(!ninjacost(C, 800)) //Same spawn cost but higher upkeep cost
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(!kamikaze)
|
||||
if(!U.get_active_hand()&&!istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade))
|
||||
@@ -187,13 +148,13 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
|
||||
/*Shoots ninja stars at random people.
|
||||
This could be a lot better but I'm too tired atm.*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
|
||||
set name = "Energy Star (5E)"
|
||||
set name = "Energy Star (1,000E)"
|
||||
set desc = "Launches an energy star at a random living target."
|
||||
set category = "Ninja Ability"
|
||||
set popup_menu = 0
|
||||
|
||||
var/C = 50
|
||||
if(!ninjacost(C))
|
||||
if(!ninjacost(C,1))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/targets[] = list()//So yo can shoot while yo throw dawg
|
||||
for(var/mob/living/M in oview(loc))
|
||||
@@ -212,7 +173,7 @@ This could be a lot better but I'm too tired atm.*/
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
cell.charge-=(C*10)
|
||||
cell.charge-=(C*100)// Ninja stars now cost 100 energy, stil la fair chunk to avoid spamming, will run out of power quickly if used 3 or more times
|
||||
A.process()
|
||||
else
|
||||
U << "\red There are no targets in view."
|
||||
@@ -222,13 +183,13 @@ This could be a lot better but I'm too tired atm.*/
|
||||
/*Allows the ninja to capture people, I guess.
|
||||
Must right click on a mob to activate.*/
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs.
|
||||
set name = "Energy Net (20E)"
|
||||
set name = "Energy Net (8,000E)"
|
||||
set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
|
||||
set category = null
|
||||
set src = usr.contents
|
||||
|
||||
var/C = 200
|
||||
if(!ninjacost(C,1)&&iscarbon(M))
|
||||
var/C = 500
|
||||
if(!ninjacost(C,80)&&iscarbon(M)) // Nets now cost 8,000
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
|
||||
//if(M)//DEBUG
|
||||
@@ -249,7 +210,7 @@ Must right click on a mob to activate.*/
|
||||
E.master = U
|
||||
spawn(0)//Parallel processing.
|
||||
E.process(M)
|
||||
cell.charge-=(C*10)
|
||||
cell.charge-=(C*100) // Nets now cost what should be most of a standard battery, since your taking someone out of the round
|
||||
else
|
||||
U << "They are already trapped inside an energy net."
|
||||
else
|
||||
@@ -270,7 +231,6 @@ Movement impairing would indicate drugs and the like.*/
|
||||
//Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly.
|
||||
//For now, adrenaline boosters ARE the miracle injection. Well, radium, really.
|
||||
U.SetParalysis(0)
|
||||
U.SetStunned(0)
|
||||
U.SetWeakened(0)
|
||||
/*
|
||||
Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat.
|
||||
|
||||
@@ -1333,10 +1333,10 @@ It is possible to destroy the net by the occupant or someone else.
|
||||
return
|
||||
|
||||
process(var/mob/living/carbon/M as mob)
|
||||
var/check = 30//30 seconds before teleportation. Could be extended I guess.
|
||||
var/check = 60//30 seconds before teleportation. Could be extended I guess. - Extended to one minute
|
||||
var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
|
||||
//The person can still try and attack the net when inside.
|
||||
while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed.
|
||||
while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 60 seconds have not passed.
|
||||
check--
|
||||
sleep(10)
|
||||
|
||||
|
||||
@@ -656,7 +656,6 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
@@ -669,8 +668,6 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs()
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjablade
|
||||
@@ -681,11 +678,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_kamikaze(mob/living/carbon/U)
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
|
||||
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage
|
||||
@@ -710,11 +703,8 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze(mob/living/carbon/U)
|
||||
if(kamikaze)
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
|
||||
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage
|
||||
|
||||
@@ -157,10 +157,10 @@
|
||||
|
||||
|
||||
/datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code)
|
||||
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
|
||||
// var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
|
||||
spawn(1)
|
||||
NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
|
||||
synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
|
||||
// NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
|
||||
synd_mind.current.real_name = "[pick(first_names_male)] [pick(last_names)]"
|
||||
if (nuke_code)
|
||||
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
|
||||
synd_mind.current << "The nuclear authorization code is: <B>[nuke_code]</B>"
|
||||
@@ -330,7 +330,7 @@
|
||||
return 1
|
||||
|
||||
|
||||
/proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho.
|
||||
/*/proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho.
|
||||
var/randomname = pick(last_names)
|
||||
var/newname = copytext(sanitize(input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname)),1,MAX_NAME_LEN)
|
||||
|
||||
@@ -343,13 +343,13 @@
|
||||
return nukelastname(M)
|
||||
|
||||
return newname
|
||||
|
||||
*/
|
||||
/proc/NukeNameAssign(var/lastname,var/list/syndicates)
|
||||
for(var/datum/mind/synd_mind in syndicates)
|
||||
switch(synd_mind.current.gender)
|
||||
if(MALE)
|
||||
synd_mind.name = "[pick(first_names_male)] [lastname]"
|
||||
synd_mind.name = "[pick(first_names_male)] [pick(last_names)]"
|
||||
if(FEMALE)
|
||||
synd_mind.name = "[pick(first_names_female)] [lastname]"
|
||||
synd_mind.name = "[pick(first_names_female)] [pick(last_names)]"
|
||||
synd_mind.current.real_name = synd_mind.name
|
||||
return
|
||||
@@ -64,6 +64,7 @@
|
||||
/var/const/access_gateway = 62
|
||||
/var/const/access_sec_doors = 63 // Security front doors
|
||||
/var/const/access_psychiatrist = 64 // Psychiatrist's office
|
||||
/var/const/access_xenoarch = 65
|
||||
|
||||
//BEGIN CENTCOM ACCESS
|
||||
/*Should leave plenty of room if we need to add more access levels.
|
||||
@@ -209,7 +210,7 @@
|
||||
access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, access_surgery,
|
||||
access_theatre, access_research, access_mining, access_mailsorting,
|
||||
access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
|
||||
access_keycard_auth, access_tcomsat, access_gateway)
|
||||
access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
|
||||
|
||||
/proc/get_all_centcom_access()
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
|
||||
@@ -226,7 +227,7 @@
|
||||
if(2) //medbay
|
||||
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_psychiatrist, access_virology, access_surgery, access_cmo)
|
||||
if(3) //research
|
||||
return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_rd)
|
||||
return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_xenoarch, access_rd)
|
||||
if(4) //engineering and maintenance
|
||||
return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_ce)
|
||||
if(5) //command
|
||||
@@ -370,6 +371,8 @@
|
||||
return "Mining EVA"
|
||||
if(access_xenobiology)
|
||||
return "Xenobiology Lab"
|
||||
if(access_xenoarch)
|
||||
return "Xenoarchaeology"
|
||||
if(access_hop)
|
||||
return "Head of Personnel"
|
||||
if(access_hos)
|
||||
@@ -412,7 +415,7 @@
|
||||
return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Chef", "Botanist", "Quartermaster", "Cargo Technician",
|
||||
"Shaft Miner", /*"Clown", "Mime", */"Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer",
|
||||
"Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist",
|
||||
"Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer")
|
||||
"Research Director", "Scientist", "Xenobiologist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer")
|
||||
|
||||
/proc/get_all_centcom_jobs()
|
||||
return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander")
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway)
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
|
||||
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway)
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
|
||||
minimal_player_age = 7
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -44,9 +44,9 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist")
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher")
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -63,6 +63,32 @@
|
||||
|
||||
|
||||
|
||||
/datum/job/xenobiologist
|
||||
title = "Xenobiologist"
|
||||
flag = XENOBIOLOGIST
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
minimal_access = list(access_research, access_xenobiology)
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_ears)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit)
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
|
||||
return 1
|
||||
|
||||
|
||||
/datum/job/roboticist
|
||||
title = "Roboticist"
|
||||
flag = ROBOTICIST
|
||||
|
||||
@@ -9,9 +9,8 @@ var/const/OFFICER =(1<<4)
|
||||
var/const/CHIEF =(1<<5)
|
||||
var/const/ENGINEER =(1<<6)
|
||||
var/const/ATMOSTECH =(1<<7)
|
||||
var/const/ROBOTICIST =(1<<8)
|
||||
var/const/AI =(1<<9)
|
||||
var/const/CYBORG =(1<<10)
|
||||
var/const/AI =(1<<8)
|
||||
var/const/CYBORG =(1<<9)
|
||||
|
||||
|
||||
var/const/MEDSCI =(1<<1)
|
||||
@@ -24,6 +23,8 @@ var/const/DOCTOR =(1<<4)
|
||||
var/const/GENETICIST =(1<<5)
|
||||
var/const/VIROLOGIST =(1<<6)
|
||||
var/const/PSYCHIATRIST =(1<<7)
|
||||
var/const/ROBOTICIST =(1<<8)
|
||||
var/const/XENOBIOLOGIST =(1<<9)
|
||||
|
||||
|
||||
var/const/CIVILIAN =(1<<2)
|
||||
@@ -78,7 +79,8 @@ var/list/science_positions = list(
|
||||
"Research Director",
|
||||
"Scientist",
|
||||
"Geneticist", //Part of both medical and science
|
||||
"Roboticist"
|
||||
"Roboticist",
|
||||
"Xenobiologist"
|
||||
)
|
||||
|
||||
//BS12 EDIT
|
||||
|
||||
@@ -284,10 +284,10 @@
|
||||
var/internal_bleeding = ""
|
||||
var/lung_ruptured = ""
|
||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||
internal_bleeding = "<br>Internal Bleeding"
|
||||
internal_bleeding = "<br>Internal bleeding"
|
||||
break
|
||||
if(istype(e, /datum/organ/external/chest) && occupant.is_lung_ruptured())
|
||||
lung_ruptured = "Lung Ruptured:"
|
||||
lung_ruptured = "Lung ruptured:"
|
||||
if(e.status & ORGAN_SPLINTED)
|
||||
splint = "Splinted:"
|
||||
if(e.status & ORGAN_BLEEDING)
|
||||
@@ -297,7 +297,7 @@
|
||||
if(e.open)
|
||||
open = "Open:"
|
||||
if(e.implants.len)
|
||||
imp = "Implanted:"
|
||||
imp = "Unknown body present:"
|
||||
if(!AN && !open && !infected & !imp)
|
||||
AN = "None:"
|
||||
if(!(e.status & ORGAN_DESTROYED))
|
||||
|
||||
@@ -135,9 +135,9 @@
|
||||
if(!istype(location)) return//returns if loc is not simulated
|
||||
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
var/temperature_dangerlevel = get_danger_level(environment.temperature, TLV["temperature"])
|
||||
|
||||
//Handle temperature adjustment here.
|
||||
if(temperature_dangerlevel || regulating_temperature)
|
||||
if(environment.temperature < target_temperature - 10 || environment.temperature > target_temperature + 10 || regulating_temperature)
|
||||
//If it goes too far, we should adjust ourselves back before stopping.
|
||||
if(!regulating_temperature)
|
||||
regulating_temperature = 1
|
||||
@@ -368,7 +368,8 @@
|
||||
send_signal(device_id, list("power"= 0) )
|
||||
|
||||
proc/apply_danger_level(var/new_danger_level)
|
||||
alarm_area.atmosalm = new_danger_level
|
||||
if (alarm_area.atmosalert(new_danger_level))
|
||||
post_alert(new_danger_level)
|
||||
|
||||
for (var/area/A in alarm_area.related)
|
||||
for (var/obj/machinery/alarm/AA in A)
|
||||
@@ -382,6 +383,26 @@
|
||||
|
||||
update_icon()
|
||||
|
||||
proc/post_alert(alert_level)
|
||||
var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency)
|
||||
if(!frequency)
|
||||
return
|
||||
|
||||
var/datum/signal/alert_signal = new
|
||||
alert_signal.source = src
|
||||
alert_signal.transmission_method = 1
|
||||
alert_signal.data["zone"] = alarm_area.name
|
||||
alert_signal.data["type"] = "Atmospheric"
|
||||
|
||||
if(alert_level==2)
|
||||
alert_signal.data["alert"] = "severe"
|
||||
else if (alert_level==1)
|
||||
alert_signal.data["alert"] = "minor"
|
||||
else if (alert_level==0)
|
||||
alert_signal.data["alert"] = "clear"
|
||||
|
||||
frequency.post_signal(src, alert_signal)
|
||||
|
||||
proc/refresh_danger_level()
|
||||
var/level = 0
|
||||
for (var/area/A in alarm_area.related)
|
||||
@@ -828,12 +849,12 @@ Toxins: <span class='dl[plasma_dangerlevel]'>[plasma_percent]</span>%<br>
|
||||
|
||||
if (AALARM_SCREEN_MODE)
|
||||
output += "<a href='?src=\ref[src];screen=[AALARM_SCREEN_MAIN]'>Main menu</a><br><b>Air machinery mode for the area:</b><ul>"
|
||||
var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering",\
|
||||
AALARM_MODE_REPLACEMENT = "<font color='blue'>REPLACE AIR</font>",\
|
||||
AALARM_MODE_PANIC = "<font color='red'>PANIC</font>",\
|
||||
AALARM_MODE_CYCLE = "<font color='red'>CYCLE</font>",\
|
||||
AALARM_MODE_FILL = "<font color='green'>FILL</font>",\
|
||||
AALARM_MODE_OFF = "<font color='blue'>OFFF</font>",)
|
||||
var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering - Scrubs out contaminants",\
|
||||
AALARM_MODE_REPLACEMENT = "<font color='blue'>Replace Air - Siphons out air while replacing</font>",\
|
||||
AALARM_MODE_PANIC = "<font color='red'>Panic - Siphons air out of the room</font>",\
|
||||
AALARM_MODE_CYCLE = "<font color='red'>Cycle - Siphons air before replacing</font>",\
|
||||
AALARM_MODE_FILL = "<font color='green'>Fill - Shuts off scrubbers and opens vents</font>",\
|
||||
AALARM_MODE_OFF = "<font color='blue'>Off - Shuts off vents and scrubbers</font>",)
|
||||
for (var/m=1,m<=modes.len,m++)
|
||||
if (mode==m)
|
||||
output += "<li><A href='?src=\ref[src];mode=[m]'><b>[modes[m]]</b></A> (selected)</li>"
|
||||
|
||||
@@ -37,7 +37,7 @@ var/global/list/autolathe_recipes = list( \
|
||||
new /obj/item/device/assembly/igniter(), \
|
||||
new /obj/item/device/assembly/signaler(), \
|
||||
new /obj/item/device/radio/headset(), \
|
||||
new /obj/item/device/radio(), \
|
||||
new /obj/item/device/radio/off(), \
|
||||
new /obj/item/device/assembly/infra(), \
|
||||
new /obj/item/device/assembly/timer(), \
|
||||
new /obj/item/weapon/light/tube(), \
|
||||
|
||||
@@ -96,6 +96,36 @@
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["desert"])
|
||||
target = locate(/area/holodeck/source_desert)
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["space"])
|
||||
target = locate(/area/holodeck/source_space)
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["picnicarea"])
|
||||
target = locate(/area/holodeck/source_picnicarea)
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["snowfield"])
|
||||
target = locate(/area/holodeck/source_snowfield)
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["theatre"])
|
||||
target = locate(/area/holodeck/source_theatre)
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["meetinghall"])
|
||||
target = locate(/area/holodeck/source_meetinghall)
|
||||
if(target)
|
||||
loadProgram(target)
|
||||
|
||||
else if(href_list["turnoff"])
|
||||
target = locate(/area/holodeck/source_plating)
|
||||
if(target)
|
||||
|
||||
@@ -2,6 +2,342 @@
|
||||
#define SPECOPS_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves.
|
||||
#define SPECOPS_STATION_AREATYPE "/area/shuttle/specops/station" //Type of the spec ops shuttle area for station
|
||||
#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock
|
||||
#define SPECOPS_RETURN_DELAY 6000 //Time between the shuttle is capable of moving.
|
||||
|
||||
var/specops_shuttle_moving_to_station = 0
|
||||
var/specops_shuttle_moving_to_centcom = 0
|
||||
var/specops_shuttle_at_station = 0
|
||||
var/specops_shuttle_can_send = 1
|
||||
var/specops_shuttle_time = 0
|
||||
var/specops_shuttle_timeleft = 0
|
||||
|
||||
/obj/machinery/computer/specops_shuttle
|
||||
name = "Spec. Ops. Shuttle Console"
|
||||
icon = 'computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
req_access = list(access_cent_specops)
|
||||
// req_access = list(ACCESS_CENT_SPECOPS)
|
||||
var/temp = null
|
||||
var/hacked = 0
|
||||
var/allowedtocall = 0
|
||||
var/specops_shuttle_timereset = 0
|
||||
|
||||
/proc/specops_return()
|
||||
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
announcer.config(list("Response Team" = 0))
|
||||
|
||||
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
|
||||
var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING TO RETURN\""//Initial message shown.
|
||||
if(announcer)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
|
||||
while(specops_shuttle_time - world.timeofday > 0)
|
||||
var/ticksleft = specops_shuttle_time - world.timeofday
|
||||
|
||||
if(ticksleft > 1e5)
|
||||
specops_shuttle_time = world.timeofday + 10 // midnight rollover
|
||||
specops_shuttle_timeleft = (ticksleft / 10)
|
||||
|
||||
//All this does is announce the time before launch.
|
||||
if(announcer)
|
||||
var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
|
||||
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
|
||||
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
|
||||
if(rounded_time_left==0)
|
||||
message = "\"ALERT: TAKEOFF\""
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
|
||||
//Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
|
||||
|
||||
sleep(5)
|
||||
|
||||
specops_shuttle_moving_to_station = 0
|
||||
specops_shuttle_moving_to_centcom = 0
|
||||
|
||||
specops_shuttle_at_station = 1
|
||||
|
||||
var/area/start_location = locate(/area/shuttle/specops/station)
|
||||
var/area/end_location = locate(/area/shuttle/specops/centcom)
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in end_location)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
// hey you, get out of the way!
|
||||
for(var/turf/T in dstturfs)
|
||||
// find the turf to move things to
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
//var/turf/E = get_step(D, SOUTH)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
start_location.move_contents_to(end_location)
|
||||
|
||||
for(var/turf/T in get_area_turfs(end_location) )
|
||||
var/mob/M = locate(/mob) in T
|
||||
M << "\red You have arrived at Central Command. Operation has ended!"
|
||||
|
||||
specops_shuttle_at_station = 0
|
||||
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
|
||||
|
||||
del(announcer)
|
||||
|
||||
/proc/specops_process()
|
||||
var/area/centcom/specops/special_ops = locate()//Where is the specops area located?
|
||||
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
announcer.config(list("Response Team" = 0))
|
||||
|
||||
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
|
||||
var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH\""//Initial message shown.
|
||||
if(announcer)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
// message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
|
||||
// announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
|
||||
while(specops_shuttle_time - world.timeofday > 0)
|
||||
var/ticksleft = specops_shuttle_time - world.timeofday
|
||||
|
||||
if(ticksleft > 1e5)
|
||||
specops_shuttle_time = world.timeofday + 10 // midnight rollover
|
||||
specops_shuttle_timeleft = (ticksleft / 10)
|
||||
|
||||
//All this does is announce the time before launch.
|
||||
if(announcer)
|
||||
var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
|
||||
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
|
||||
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
|
||||
if(rounded_time_left==0)
|
||||
message = "\"ALERT: TAKEOFF\""
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
|
||||
//Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
|
||||
|
||||
sleep(5)
|
||||
|
||||
specops_shuttle_moving_to_station = 0
|
||||
specops_shuttle_moving_to_centcom = 0
|
||||
|
||||
specops_shuttle_at_station = 1
|
||||
if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\red The Special Operations shuttle is unable to leave."
|
||||
return
|
||||
|
||||
//Begin Marauder launchpad.
|
||||
spawn(0)//So it parallel processes it.
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)//1 second delay between each.
|
||||
M.open()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.open()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.open()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.open()
|
||||
|
||||
sleep(10)
|
||||
|
||||
var/spawn_marauder[] = new()
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
if(L.name == "Marauder Entry")
|
||||
spawn_marauder.Add(L)
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
if(L.name == "Marauder Exit")
|
||||
var/obj/effect/portal/P = new(L.loc)
|
||||
P.invisibility = 101//So it is not seen by anyone.
|
||||
P.failchance = 0//So it has no fail chance when teleporting.
|
||||
P.target = pick(spawn_marauder)//Where the marauder will arrive.
|
||||
spawn_marauder.Remove(P.target)
|
||||
|
||||
sleep(10)
|
||||
|
||||
for(var/obj/machinery/mass_driver/M in special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)
|
||||
M.drive()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.drive()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.drive()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.drive()
|
||||
|
||||
sleep(50)//Doors remain open for 5 seconds.
|
||||
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)//Doors close at the same time.
|
||||
if("ASSAULT0")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT1")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT2")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT3")
|
||||
spawn(0)
|
||||
M.close()
|
||||
special_ops.readyreset()//Reset firealarm after the team launched.
|
||||
//End Marauder launchpad.
|
||||
|
||||
var/area/start_location = locate(/area/shuttle/specops/centcom)
|
||||
var/area/end_location = locate(/area/shuttle/specops/station)
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in end_location)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
// hey you, get out of the way!
|
||||
for(var/turf/T in dstturfs)
|
||||
// find the turf to move things to
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
//var/turf/E = get_step(D, SOUTH)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
start_location.move_contents_to(end_location)
|
||||
|
||||
for(var/turf/T in get_area_turfs(end_location) )
|
||||
var/mob/M = locate(/mob) in T
|
||||
M << "\red You have arrived to [station_name]. Commence operation!"
|
||||
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
|
||||
|
||||
del(announcer)
|
||||
|
||||
/proc/specops_can_move()
|
||||
if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom)
|
||||
return 0
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
if(world.timeofday <= S.specops_shuttle_timereset)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_paw(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob)
|
||||
if(istype(I,/obj/item/weapon/card/emag))
|
||||
user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals."
|
||||
else
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied."
|
||||
return
|
||||
|
||||
//Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle.
|
||||
// if (sent_strike_team == 0 && send_emergency_team == 0)
|
||||
// usr << "\red The strike team has not yet deployed."
|
||||
// return
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
user.machine = src
|
||||
var/dat
|
||||
if (temp)
|
||||
dat = temp
|
||||
else
|
||||
dat += {"<BR><B>Special Operations Shuttle</B><HR>
|
||||
\nLocation: [specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "Departing for [station_name] in ([specops_shuttle_timeleft] seconds.)":specops_shuttle_at_station ? "Station":"Dock"]<BR>
|
||||
[specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.*<BR>\n<BR>":specops_shuttle_at_station ? "\n<A href='?src=\ref[src];sendtodock=1'>Shuttle standing by...</A><BR>\n<BR>":"\n<A href='?src=\ref[src];sendtostation=1'>Depart to [station_name]</A><BR>\n<BR>"]
|
||||
\n<A href='?src=\ref[user];mach_close=computer'>Close</A>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
|
||||
usr.machine = src
|
||||
|
||||
if (href_list["sendtodock"])
|
||||
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\blue Central Command will not allow the Special Operations shuttle to return yet."
|
||||
if(world.timeofday <= specops_shuttle_timereset)
|
||||
if (((world.timeofday - specops_shuttle_timereset)/10) > 60)
|
||||
usr << "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!"
|
||||
usr << "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!"
|
||||
return
|
||||
|
||||
usr << "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds."
|
||||
|
||||
temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
updateUsrDialog()
|
||||
|
||||
specops_shuttle_moving_to_centcom = 1
|
||||
specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
|
||||
spawn(0)
|
||||
specops_return()
|
||||
|
||||
else if (href_list["sendtostation"])
|
||||
if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\red The Special Operations shuttle is unable to leave."
|
||||
return
|
||||
|
||||
usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds."
|
||||
|
||||
temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
updateUsrDialog()
|
||||
|
||||
var/area/centcom/specops/special_ops = locate()
|
||||
if(special_ops)
|
||||
special_ops.readyalert()//Trigger alarm for the spec ops area.
|
||||
specops_shuttle_moving_to_station = 1
|
||||
|
||||
specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
|
||||
spawn(0)
|
||||
specops_process()
|
||||
|
||||
else if (href_list["mainmenu"])
|
||||
temp = null
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/*//Config stuff
|
||||
#define SPECOPS_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves.
|
||||
#define SPECOPS_STATION_AREATYPE "/area/shuttle/specops/station" //Type of the spec ops shuttle area for station
|
||||
#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock
|
||||
|
||||
var/specops_shuttle_moving_to_station = 0
|
||||
var/specops_shuttle_moving_to_centcom = 0
|
||||
@@ -179,9 +515,9 @@ var/specops_shuttle_timeleft = 0
|
||||
user << "\red Access Denied."
|
||||
return
|
||||
|
||||
if (sent_strike_team == 0)
|
||||
usr << "\red The strike team has not yet deployed."
|
||||
return
|
||||
// if (sent_strike_team == 0)
|
||||
// usr << "\red The strike team has not yet deployed."
|
||||
// return
|
||||
|
||||
if(..())
|
||||
return
|
||||
@@ -239,4 +575,5 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
return
|
||||
*/
|
||||
@@ -1238,7 +1238,11 @@ About the new airlock wires panel:
|
||||
var/obj/item/weapon/airlock_electronics/ae
|
||||
if(!electronics)
|
||||
ae = new/obj/item/weapon/airlock_electronics( src.loc )
|
||||
ae.conf_access = src.req_access
|
||||
if(src.req_access.len)
|
||||
ae.conf_access = src.req_access
|
||||
else if (src.req_one_access.len)
|
||||
ae.conf_access = src.req_one_access
|
||||
ae.one_access = 1
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
req_access = list(access_engine)
|
||||
|
||||
var/list/conf_access = null
|
||||
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
|
||||
var/last_configurator = null
|
||||
var/locked = 1
|
||||
|
||||
@@ -33,6 +34,8 @@
|
||||
else
|
||||
t1 += "<a href='?src=\ref[src];logout=1'>Block</a><hr>"
|
||||
|
||||
t1 += "Access requirement is set to "
|
||||
t1 += one_access ? "<a style='color: green' href='?src=\ref[src];one_access=1'>ONE</a><hr>" : "<a style='color: red' href='?src=\ref[src];one_access=1'>ALL</a><hr>"
|
||||
|
||||
t1 += conf_access == null ? "<font color=red>All</font><br>" : "<a href='?src=\ref[src];access=all'>All</a><br>"
|
||||
|
||||
@@ -44,6 +47,8 @@
|
||||
|
||||
if (!conf_access || !conf_access.len || !(acc in conf_access))
|
||||
t1 += "<a href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
|
||||
else if(one_access)
|
||||
t1 += "<a style='color: green' href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
|
||||
else
|
||||
t1 += "<a style='color: red' href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
|
||||
|
||||
@@ -75,6 +80,9 @@
|
||||
if (href_list["logout"])
|
||||
locked = 1
|
||||
|
||||
if (href_list["one_access"])
|
||||
one_access = !one_access
|
||||
|
||||
if (href_list["access"])
|
||||
toggle_access(href_list["access"])
|
||||
|
||||
|
||||
@@ -130,6 +130,21 @@
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
|
||||
CC.amount = 2
|
||||
var/obj/item/weapon/airlock_electronics/ae
|
||||
if(!electronics)
|
||||
ae = new/obj/item/weapon/airlock_electronics( src.loc )
|
||||
if(src.req_access.len)
|
||||
ae.conf_access = src.req_access
|
||||
else if (src.req_one_access.len)
|
||||
ae.conf_access = src.req_one_access
|
||||
ae.one_access = 1
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = src.loc
|
||||
if(operating == -1)
|
||||
ae.icon_state = "door_electronics_smoked"
|
||||
operating = 0
|
||||
src.density = 0
|
||||
del(src)
|
||||
return
|
||||
@@ -162,15 +177,9 @@
|
||||
if(istype(user, /mob/living/carbon/alien/humanoid) || istype(user, /mob/living/carbon/slime/adult))
|
||||
if(src.operating)
|
||||
return
|
||||
src.health = max(0, src.health - 25)
|
||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
visible_message("\red <B>[user] smashes against the [src.name].</B>", 1)
|
||||
if (src.health <= 0)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
|
||||
CC.amount = 2
|
||||
src.density = 0
|
||||
del(src)
|
||||
take_damage(25)
|
||||
else
|
||||
return src.attack_hand(user)
|
||||
|
||||
@@ -181,7 +190,7 @@
|
||||
/obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/user as mob)
|
||||
|
||||
//If it's in the process of opening/closing, ignore the click
|
||||
if (src.operating)
|
||||
if (src.operating == 1)
|
||||
return
|
||||
|
||||
//Emags and ninja swords? You may pass.
|
||||
@@ -199,19 +208,50 @@
|
||||
open()
|
||||
return 1
|
||||
|
||||
//If it's emagged, crowbar can pry electronics out.
|
||||
if (src.operating == -1 && istype(I, /obj/item/weapon/crowbar))
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] removes the electronics from the windoor.", "You start to remove electronics from the windoor.")
|
||||
if (do_after(user,40))
|
||||
user << "\blue You removed the windoor electronics!"
|
||||
|
||||
var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc)
|
||||
if (istype(src, /obj/machinery/door/window/brigdoor))
|
||||
wa.secure = "secure_"
|
||||
wa.name = "Secure Wired Windoor Assembly"
|
||||
else
|
||||
wa.name = "Wired Windoor Assembly"
|
||||
if (src.base_state == "right" || src.base_state == "rightsecure")
|
||||
wa.facing = "r"
|
||||
wa.dir = src.dir
|
||||
wa.state = "02"
|
||||
wa.update_icon()
|
||||
|
||||
var/obj/item/weapon/airlock_electronics/ae
|
||||
if(!electronics)
|
||||
ae = new/obj/item/weapon/airlock_electronics( src.loc )
|
||||
if(src.req_access.len)
|
||||
ae.conf_access = src.req_access
|
||||
else if (src.req_one_access.len)
|
||||
ae.conf_access = src.req_one_access
|
||||
ae.one_access = 1
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = src.loc
|
||||
ae.icon_state = "door_electronics_smoked"
|
||||
|
||||
operating = 0
|
||||
del(src)
|
||||
return
|
||||
|
||||
//If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway)
|
||||
if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card))
|
||||
var/aforce = I.force
|
||||
if(I.damtype == BRUTE || I.damtype == BURN)
|
||||
src.health = max(0, src.health - aforce)
|
||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
visible_message("\red <B>[src] was hit by [I].</B>")
|
||||
if (src.health <= 0)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
|
||||
CC.amount = 2
|
||||
src.density = 0
|
||||
del(src)
|
||||
if(I.damtype == BRUTE || I.damtype == BURN)
|
||||
take_damage(aforce)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood))
|
||||
// speed up transfer on blood packs
|
||||
transfer_amount = 4
|
||||
attached.inject_blood(beaker,transfer_amount)
|
||||
src.beaker.reagents.trans_to(src.attached, transfer_amount)
|
||||
update_icon()
|
||||
|
||||
// Take blood
|
||||
@@ -112,7 +112,8 @@
|
||||
|
||||
if (B)
|
||||
beaker.reagents.reagent_list |= B
|
||||
beaker.reagents.update_total()
|
||||
beaker.reagents.del_reagent("clonexadone") //Fix for infinite meat spawning when taking blood from human
|
||||
beaker.reagents.update_total() //to an IV drip full of clonex
|
||||
beaker.on_reagent_change()
|
||||
beaker.reagents.handle_reactions()
|
||||
update_icon()
|
||||
|
||||
@@ -1053,4 +1053,16 @@
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/paintkit //Please don't use this for anything, it's a base type for custom mech paintjobs.
|
||||
name = "mecha customisation kit"
|
||||
desc = "A generic kit containing all the needed tools and parts to turn a mech into another mech."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "royce_kit"
|
||||
|
||||
var/new_name = "mech" //What is the variant called?
|
||||
var/new_desc = "A mech." //How is the new mech described?
|
||||
var/new_icon = "ripley" //What base icon will the new mech use?
|
||||
var/removable = null //Can the kit be removed?
|
||||
var/list/allowed_types = list() //Types of mech that the kit will work on.
|
||||
@@ -44,7 +44,12 @@
|
||||
/obj/item/robot_parts/l_arm,
|
||||
/obj/item/robot_parts/r_arm,
|
||||
/obj/item/robot_parts/l_leg,
|
||||
/obj/item/robot_parts/r_leg
|
||||
/obj/item/robot_parts/r_leg,
|
||||
/obj/item/robot_parts/robot_component/binary_communication_device,
|
||||
/obj/item/robot_parts/robot_component/radio,
|
||||
/obj/item/robot_parts/robot_component/actuator,
|
||||
/obj/item/robot_parts/robot_component/diagnosis_unit,
|
||||
/obj/item/robot_parts/robot_component/camera
|
||||
),
|
||||
"Ripley"=list(
|
||||
/obj/item/mecha_parts/chassis/ripley,
|
||||
|
||||
@@ -759,6 +759,34 @@
|
||||
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]")
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/paintkit))
|
||||
|
||||
if(occupant)
|
||||
user << "You can't customize a mech while someone is piloting it - that would be unsafe!"
|
||||
return
|
||||
|
||||
var/obj/item/weapon/paintkit/P = W
|
||||
var/found = null
|
||||
|
||||
for(var/type in P.allowed_types)
|
||||
if(type==src.initial_icon)
|
||||
found = 1
|
||||
break
|
||||
|
||||
if(!found)
|
||||
user << "That kit isn't meant for use on this class of exosuit."
|
||||
return
|
||||
|
||||
user.visible_message("[user] opens [P] and spends some quality time customising [src].")
|
||||
|
||||
src.name = P.new_name
|
||||
src.desc = P.new_desc
|
||||
src.initial_icon = P.new_icon
|
||||
src.reset_icon()
|
||||
|
||||
user.drop_item()
|
||||
del(P)
|
||||
|
||||
else
|
||||
call((proc_res["dynattackby"]||src), "dynattackby")(W,user)
|
||||
/*
|
||||
|
||||
@@ -571,6 +571,7 @@
|
||||
custom_action(step, atom/used_atom, mob/user)
|
||||
user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]")
|
||||
holder.overlays += used_atom.icon_state+"+o"
|
||||
user.drop_item()
|
||||
del used_atom
|
||||
return 1
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world."
|
||||
name = "APLU \"Ripley\""
|
||||
icon_state = "ripley"
|
||||
initial_icon = "ripley"
|
||||
step_in = 6
|
||||
max_temperature = 20000
|
||||
health = 200
|
||||
@@ -19,6 +20,7 @@
|
||||
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
|
||||
name = "APLU \"Firefighter\""
|
||||
icon_state = "firefighter"
|
||||
initial_icon = "firefighter"
|
||||
max_temperature = 65000
|
||||
health = 250
|
||||
lights_power = 8
|
||||
@@ -107,18 +109,4 @@
|
||||
T.Entered(A)
|
||||
step_rand(A)
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/working/ripley/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/fluff/sven_fjeltson_1))//this shit broke ripleys
|
||||
src.icon_state = "earth"
|
||||
src.initial_icon = "earth"
|
||||
src.name = "APLU \"Strike the Earth!\""
|
||||
src.desc = "Looks like an over worked, under maintained Ripley with some horrific damage."
|
||||
user << "You pick up your old \"Strike the Earth!\" APLU."
|
||||
user.drop_item()
|
||||
del(W)
|
||||
return
|
||||
else
|
||||
..()
|
||||
return
|
||||
@@ -110,6 +110,11 @@
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message("\red [usr] destroys the [name]!", 1)
|
||||
health = 0
|
||||
else
|
||||
usr << "\blue You claw at the [name]."
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message("\red [usr] claws at the [name]!", 1)
|
||||
health -= rand(5,10)
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
anchored = 1
|
||||
|
||||
New()
|
||||
var/list/valid_states = list("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead")
|
||||
var/list/valid_states = list("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead", "whiskeyimplant", "carpecarp", "robustroadhouse", "greytide", "theredshirt")
|
||||
src.icon_state = "[pick(valid_states)]"
|
||||
|
||||
@@ -850,7 +850,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
P.overlays.Cut()
|
||||
P.overlays += image('icons/obj/pda.dmi', "pda-r")
|
||||
else
|
||||
U << "<span class='notice'>ERROR: Server isn't responding.</span>"
|
||||
U << "<span class='notice'>ERROR: Messaging server is not responding.</span>"
|
||||
|
||||
|
||||
/obj/item/device/pda/verb/verb_remove_id()
|
||||
@@ -1162,7 +1162,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
|
||||
plist[text("[name]")] = P
|
||||
return plist
|
||||
|
||||
|
||||
|
||||
//Some spare PDAs in a box
|
||||
/obj/item/weapon/storage/box/PDAs
|
||||
|
||||
@@ -808,4 +808,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if(radio_controller)
|
||||
for (var/ch_name in op)
|
||||
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/device/radio/off
|
||||
listening = 0
|
||||
@@ -4,18 +4,35 @@
|
||||
icon_state = "voice0"
|
||||
item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang)
|
||||
w_class = 1.0
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
|
||||
var/spamcheck = 0
|
||||
|
||||
var/emagged = 0
|
||||
var/insults = 0//just in case
|
||||
|
||||
/obj/item/device/hailer/attack_self(mob/living/carbon/user as mob)
|
||||
if (spamcheck)
|
||||
return
|
||||
|
||||
playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
|
||||
user.visible_message("<span class='warning'>[user]'s [name] rasps, \"Halt! Security!\"</span>")
|
||||
if(emagged)
|
||||
if(insults >= 1)
|
||||
playsound(get_turf(src), 'sound/voice/binsult.ogg', 100, 1, vary = 0)//hueheuheuheuheuheuhe
|
||||
user.visible_message("<span class='warning'>[user]'s [name] gurgles, \"FUCK YOUR CUNT YOU SHIT EATING CUNT TILL YOU ARE A MASS EATING SHIT CUNT. EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS TO FUCK UP SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FROM THE DEPTHS OF SHIT\"</span>")
|
||||
insults--
|
||||
else
|
||||
user << "\red *BZZZZcuntZZZZT*"
|
||||
else
|
||||
playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
|
||||
user.visible_message("<span class='warning'>[user]'s [name] rasps, \"Halt! Security!\"</span>")
|
||||
|
||||
spamcheck = 1
|
||||
spawn(20)
|
||||
spamcheck = 0
|
||||
spamcheck = 0
|
||||
|
||||
/obj/item/device/hailer/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/weapon/card/emag) && !emagged)
|
||||
user << "\red You overload \the [src]'s voice synthesizer."
|
||||
emagged = 1
|
||||
insults = rand(1, 3)//to prevent dickflooding
|
||||
return
|
||||
return
|
||||
@@ -8,6 +8,7 @@
|
||||
var/construction_time = 100
|
||||
var/list/construction_cost = list("metal"=20000,"glass"=5000)
|
||||
var/list/part = null
|
||||
var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics.
|
||||
|
||||
/obj/item/robot_parts/l_arm
|
||||
name = "robot left arm"
|
||||
@@ -161,7 +162,7 @@
|
||||
else
|
||||
user << "\blue You need to attach a flash to it first!"
|
||||
|
||||
if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/mmi/posibrain))
|
||||
if(istype(W, /obj/item/device/mmi))
|
||||
var/obj/item/device/mmi/M = W
|
||||
if(check_completion())
|
||||
if(!istype(loc,/turf))
|
||||
@@ -193,7 +194,7 @@
|
||||
user << "\red This [W] does not seem to fit."
|
||||
return
|
||||
|
||||
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
|
||||
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
|
||||
if(!O) return
|
||||
|
||||
user.drop_item()
|
||||
@@ -278,3 +279,13 @@
|
||||
del(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/weapon/card/emag))
|
||||
if(sabotaged)
|
||||
user << "\red [src] is already sabotaged!"
|
||||
else
|
||||
user << "\red You slide [W] into the dataport on [src] and short out the safeties."
|
||||
sabotaged = 1
|
||||
return
|
||||
..()
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R)
|
||||
if(R.stat == DEAD)
|
||||
usr << "/red The [src] will not function on a deceased robot."
|
||||
usr << "\red The [src] will not function on a deceased robot."
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -153,6 +153,7 @@
|
||||
icon_state = "knife"
|
||||
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
sharp = 1
|
||||
force = 10.0
|
||||
w_class = 3.0
|
||||
throwforce = 6.0
|
||||
|
||||
@@ -277,7 +277,41 @@
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src)
|
||||
/obj/item/weapon/storage/box/farwacubes
|
||||
name = "farwa cube box"
|
||||
desc = "Drymate brand farwa cubes. Just add water!"
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "monkeycubebox"
|
||||
storage_slots = 7
|
||||
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/farwacube")
|
||||
New()
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/farwacube/wrapped(src)
|
||||
|
||||
/obj/item/weapon/storage/box/stokcubes
|
||||
name = "stok cube box"
|
||||
desc = "Drymate brand stok cubes. Just add water!"
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "monkeycubebox"
|
||||
storage_slots = 7
|
||||
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/stokcube")
|
||||
New()
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/stokcube/wrapped(src)
|
||||
|
||||
/obj/item/weapon/storage/box/neaeracubes
|
||||
name = "neaera cube box"
|
||||
desc = "Drymate brand neaera cubes. Just add water!"
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "monkeycubebox"
|
||||
storage_slots = 7
|
||||
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/stokcube")
|
||||
New()
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/neaeracube/wrapped(src)
|
||||
|
||||
/obj/item/weapon/storage/box/ids
|
||||
name = "spare IDs"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
m_amt = 10000
|
||||
g_amt = 5000
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
w_class = 1.0
|
||||
w_class = 2.0
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
|
||||
/*HAHA, SUCK IT, 2000 LINES OF SPAGHETTI CODE!
|
||||
@@ -133,7 +133,7 @@ LOOK FOR SURGERY.DM*/
|
||||
m_amt = 5000
|
||||
g_amt = 2500
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
w_class = 1.0
|
||||
w_class = 2.0
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
attack_verb = list("attacked", "pinched")
|
||||
|
||||
@@ -268,7 +268,7 @@ LOOK FOR SURGERY.DM*/
|
||||
m_amt = 5000
|
||||
g_amt = 2500
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
w_class = 1.0
|
||||
w_class = 2.0
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
attack_verb = list("burnt")
|
||||
|
||||
@@ -360,13 +360,13 @@ LOOK FOR SURGERY.DM*/
|
||||
g_amt = 10000
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
force = 15.0
|
||||
w_class = 1.0
|
||||
w_class = 2.0
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
attack_verb = list("drilled")
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << pick("/red <b>[user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.</b>", \
|
||||
"/red <b>[user] is pressing [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.</b>")
|
||||
viewers(user) << pick("\red <b>[user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.</b>", \
|
||||
"\red <b>[user] is pressing [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.</b>")
|
||||
return (BRUTELOSS)
|
||||
|
||||
/*
|
||||
@@ -379,7 +379,7 @@ LOOK FOR SURGERY.DM*/
|
||||
icon_state = "scalpel"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
force = 10.0
|
||||
w_class = 1.0
|
||||
w_class = 2.0
|
||||
throwforce = 5.0
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
@@ -631,7 +631,7 @@ LOOK FOR SURGERY.DM*/
|
||||
hitsound = 'sound/weapons/circsawhit.ogg'
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
force = 15.0
|
||||
w_class = 1.0
|
||||
w_class = 2.0
|
||||
throwforce = 9.0
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
@@ -797,6 +797,7 @@ LOOK FOR SURGERY.DM*/
|
||||
icon = 'surgery.dmi'
|
||||
icon_state = "bone-gel"
|
||||
force = 0
|
||||
w_class = 2.0
|
||||
throwforce = 1.0
|
||||
|
||||
/obj/item/weapon/FixOVein
|
||||
@@ -806,6 +807,7 @@ LOOK FOR SURGERY.DM*/
|
||||
force = 0
|
||||
throwforce = 1.0
|
||||
origin_tech = "materials=1;biotech=3"
|
||||
w_class = 2.0
|
||||
var/usage_amount = 10
|
||||
|
||||
/obj/item/weapon/bonesetter
|
||||
@@ -816,4 +818,5 @@ LOOK FOR SURGERY.DM*/
|
||||
throwforce = 9.0
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
attack_verb = list("attacked", "hit", "bludgeoned")
|
||||
@@ -136,4 +136,15 @@
|
||||
|
||||
/obj/item/weapon/katana/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/harpoon
|
||||
name = "harpoon"
|
||||
sharp = 1
|
||||
desc = "Tharr she blows!"
|
||||
icon_state = "harpoon"
|
||||
item_state = "harpoon"
|
||||
force = 20
|
||||
throwforce = 15
|
||||
w_class = 3
|
||||
attack_verb = list("jabbed","stabbed","ripped")
|
||||
@@ -0,0 +1,104 @@
|
||||
/obj/random
|
||||
name = "Random Object"
|
||||
desc = "This item type is used to spawn random objects at round-start"
|
||||
icon = 'icons/misc/mark.dmi'
|
||||
icon_state = "rup"
|
||||
var/spawn_nothing_percentage = 0 // this variable determines the likelyhood that this random object will not spawn anything
|
||||
|
||||
|
||||
// creates a new object and deletes itself
|
||||
/obj/random/New()
|
||||
..()
|
||||
if (!prob(spawn_nothing_percentage))
|
||||
spawn_item()
|
||||
del src
|
||||
|
||||
|
||||
// this function should return a specific item to spawn
|
||||
/obj/random/proc/item_to_spawn()
|
||||
return 0
|
||||
|
||||
|
||||
// creates the random item
|
||||
/obj/random/proc/spawn_item()
|
||||
var/build_path = item_to_spawn()
|
||||
return (new build_path(src.loc))
|
||||
|
||||
|
||||
/obj/random/tool
|
||||
name = "Random Tool"
|
||||
desc = "This is a random tool"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "welder"
|
||||
item_to_spawn()
|
||||
return pick(/obj/item/weapon/screwdriver,\
|
||||
/obj/item/weapon/wirecutters,\
|
||||
/obj/item/weapon/weldingtool,\
|
||||
/obj/item/weapon/crowbar,\
|
||||
/obj/item/weapon/wrench,\
|
||||
/obj/item/device/flashlight)
|
||||
|
||||
|
||||
/obj/random/technology_scanner
|
||||
name = "Random Scanner"
|
||||
desc = "This is a random technology scanner."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "atmos"
|
||||
item_to_spawn()
|
||||
return pick(prob(5);/obj/item/device/t_scanner,\
|
||||
prob(2);/obj/item/device/radio/intercom,\
|
||||
prob(5);/obj/item/device/analyzer)
|
||||
|
||||
|
||||
/obj/random/powercell
|
||||
name = "Random Powercell"
|
||||
desc = "This is a random powercell."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
item_to_spawn()
|
||||
return pick(prob(10);/obj/item/weapon/cell/crap,\
|
||||
prob(40);/obj/item/weapon/cell,\
|
||||
prob(40);/obj/item/weapon/cell/high,\
|
||||
prob(9);/obj/item/weapon/cell/super,\
|
||||
prob(1);/obj/item/weapon/cell/hyper)
|
||||
|
||||
|
||||
/obj/random/bomb_supply
|
||||
name = "Bomb Supply"
|
||||
desc = "This is a random bomb supply."
|
||||
icon = 'icons/obj/assemblies/new_assemblies.dmi'
|
||||
icon_state = "signaller"
|
||||
item_to_spawn()
|
||||
return pick(/obj/item/device/assembly/igniter,\
|
||||
/obj/item/device/assembly/prox_sensor,\
|
||||
/obj/item/device/assembly/signaler)
|
||||
|
||||
|
||||
/obj/random/toolbox
|
||||
name = "Random Toolbox"
|
||||
desc = "This is a random toolbox."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "red"
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/storage/toolbox/mechanical,\
|
||||
prob(2);/obj/item/weapon/storage/toolbox/electrical,\
|
||||
prob(1);/obj/item/weapon/storage/toolbox/emergency)
|
||||
|
||||
|
||||
/obj/random/tech_supply
|
||||
name = "Random Tech Supply"
|
||||
desc = "This is a random piece of technology supplies."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
spawn_nothing_percentage = 50
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/random/powercell,\
|
||||
prob(2);/obj/random/technology_scanner,\
|
||||
prob(1);/obj/item/weapon/packageWrap,\
|
||||
prob(2);/obj/random/bomb_supply,\
|
||||
prob(1);/obj/item/weapon/extinguisher,\
|
||||
prob(1);/obj/item/clothing/gloves/fyellow,\
|
||||
prob(3);/obj/item/weapon/cable_coil,\
|
||||
prob(2);/obj/random/toolbox,\
|
||||
prob(2);/obj/item/weapon/storage/belt/utility,\
|
||||
prob(5);/obj/random/tool)
|
||||
@@ -211,8 +211,14 @@
|
||||
orient2hud()
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/emp_act(severity)
|
||||
/obj/item/clothing/suit/emp_act(severity)
|
||||
if(!istype(src.loc, /mob/living))
|
||||
for(var/obj/O in contents)
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/hear_talk(mob/M, var/msg)
|
||||
for (var/atom/A in src)
|
||||
if(istype(A,/obj/))
|
||||
var/obj/O = A
|
||||
O.hear_talk(M, msg)
|
||||
@@ -104,6 +104,10 @@
|
||||
new /obj/item/weapon/storage/backpack/industrial(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel_eng(src)
|
||||
if (prob(70))
|
||||
new /obj/item/clothing/tie/storage/brown_vest(src)
|
||||
else
|
||||
new /obj/item/clothing/tie/storage/webbing(src)
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
new /obj/item/clothing/shoes/orange(src)
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(src)
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/leather(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -187,6 +188,7 @@
|
||||
new /obj/item/clothing/glasses/sunglasses/sechud(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
new /obj/item/device/hailer(src)
|
||||
new /obj/item/clothing/tie/storage/black_vest(src)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -421,7 +421,11 @@ obj/structure/door_assembly
|
||||
door = new src.airlock_type( src.loc )
|
||||
//door.req_access = src.req_access
|
||||
door.electronics = src.electronics
|
||||
door.req_access = src.electronics.conf_access
|
||||
if(src.electronics.one_access)
|
||||
door.req_access = null
|
||||
door.req_one_access = src.electronics.conf_access
|
||||
else
|
||||
door.req_access = src.electronics.conf_access
|
||||
if(created_name)
|
||||
door.name = created_name
|
||||
src.electronics.loc = door
|
||||
|
||||
@@ -13,6 +13,12 @@
|
||||
icon_state = "bed"
|
||||
var/mob/living/buckled_mob
|
||||
|
||||
/obj/structure/stool/psychbed
|
||||
name = "psych bed"
|
||||
desc = "For prime comfort during psychiatric evaluations."
|
||||
icon_state = "psychbed"
|
||||
var/mob/living/buckled_mob
|
||||
|
||||
/obj/structure/stool/bed/alien
|
||||
name = "resting contraption"
|
||||
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
|
||||
|
||||
@@ -37,11 +37,12 @@
|
||||
/obj/structure/stool/MouseDrop(atom/over_object)
|
||||
if (istype(over_object, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = over_object
|
||||
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
|
||||
S.origin = src
|
||||
src.loc = S
|
||||
H.put_in_hands(S)
|
||||
H.visible_message("\red [H] grabs [src] from the floor!", "\red You grab [src] from the floor!")
|
||||
if (!H.restrained() && !H.stat && in_range(src, over_object))
|
||||
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
|
||||
S.origin = src
|
||||
src.loc = S
|
||||
H.put_in_hands(S)
|
||||
H.visible_message("\red [H] grabs [src] from the floor!", "\red You grab [src] from the floor!")
|
||||
|
||||
/obj/item/weapon/stool
|
||||
name = "stool"
|
||||
|
||||
@@ -107,17 +107,17 @@ obj/structure/windoor_assembly/Del()
|
||||
src.name = "Windoor Assembly"
|
||||
|
||||
//Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
|
||||
else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
|
||||
var/obj/item/stack/sheet/plasteel/P = W
|
||||
if(P.amount < 2)
|
||||
user << "\red You need more plasteel to do this."
|
||||
else if(istype(W, /obj/item/stack/rods) && !secure)
|
||||
var/obj/item/stack/rods/R = W
|
||||
if(R.amount < 4)
|
||||
user << "\red You need more rods to do this."
|
||||
return
|
||||
user << "\blue You start to reinforce the windoor with plasteel."
|
||||
user << "\blue You start to reinforce the windoor with rods."
|
||||
|
||||
if(do_after(user,40))
|
||||
if(!src) return
|
||||
|
||||
P.use(2)
|
||||
R.use(4)
|
||||
user << "\blue You reinforce the windoor."
|
||||
src.secure = "secure_"
|
||||
if(src.anchored)
|
||||
@@ -145,7 +145,7 @@ obj/structure/windoor_assembly/Del()
|
||||
if("02")
|
||||
|
||||
//Removing wire from the assembly. Step 5 undone.
|
||||
if(istype(W, /obj/item/weapon/wirecutters))
|
||||
if(istype(W, /obj/item/weapon/wirecutters) && !src.electronics)
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
|
||||
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
|
||||
|
||||
@@ -156,12 +156,12 @@ obj/structure/windoor_assembly/Del()
|
||||
new/obj/item/weapon/cable_coil(get_turf(user), 1)
|
||||
src.state = "01"
|
||||
if(src.secure)
|
||||
src.name = "Secure Wired Windoor Assembly"
|
||||
src.name = "Secure Anchored Windoor Assembly"
|
||||
else
|
||||
src.name = "Wired Windoor Assembly"
|
||||
src.name = "Anchored Windoor Assembly"
|
||||
|
||||
//Adding airlock electronics for access. Step 6 complete.
|
||||
else if(istype(W, /obj/item/weapon/airlock_electronics))
|
||||
else if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked")
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
|
||||
|
||||
@@ -177,22 +177,20 @@ obj/structure/windoor_assembly/Del()
|
||||
W.loc = src.loc
|
||||
|
||||
//Screwdriver to remove airlock electronics. Step 6 undone.
|
||||
else if(istype(W, /obj/item/weapon/screwdriver))
|
||||
else if(istype(W, /obj/item/weapon/screwdriver) && src.electronics)
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
|
||||
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.")
|
||||
|
||||
if(do_after(user, 40))
|
||||
if(!src) return
|
||||
if(!src || !src.electronics) return
|
||||
user << "\blue You've removed the airlock electronics!"
|
||||
src.name = "Wired Windoor Assembly"
|
||||
var/obj/item/weapon/airlock_electronics/ae
|
||||
if (!electronics)
|
||||
ae = new/obj/item/weapon/airlock_electronics( src.loc )
|
||||
if(src.secure)
|
||||
src.name = "Secure Wired Windoor Assembly"
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = src.loc
|
||||
|
||||
src.name = "Wired Windoor Assembly"
|
||||
var/obj/item/weapon/airlock_electronics/ae = electronics
|
||||
electronics = null
|
||||
ae.loc = src.loc
|
||||
|
||||
//Crowbar to complete the assembly, Step 7 complete.
|
||||
else if(istype(W, /obj/item/weapon/crowbar))
|
||||
@@ -221,7 +219,11 @@ obj/structure/windoor_assembly/Del()
|
||||
windoor.dir = src.dir
|
||||
windoor.density = 0
|
||||
|
||||
windoor.req_access = src.electronics.conf_access
|
||||
if(src.electronics.one_access)
|
||||
windoor.req_access = null
|
||||
windoor.req_one_access = src.electronics.conf_access
|
||||
else
|
||||
windoor.req_access = src.electronics.conf_access
|
||||
windoor.electronics = src.electronics
|
||||
src.electronics.loc = windoor
|
||||
else
|
||||
@@ -235,7 +237,11 @@ obj/structure/windoor_assembly/Del()
|
||||
windoor.dir = src.dir
|
||||
windoor.density = 0
|
||||
|
||||
windoor.req_access = src.electronics.conf_access
|
||||
if(src.electronics.one_access)
|
||||
windoor.req_access = null
|
||||
windoor.req_one_access = src.electronics.conf_access
|
||||
else
|
||||
windoor.req_access = src.electronics.conf_access
|
||||
windoor.electronics = src.electronics
|
||||
src.electronics.loc = windoor
|
||||
|
||||
|
||||
+46
-17
@@ -1,7 +1,7 @@
|
||||
//STRIKE TEAMS
|
||||
|
||||
var/list/response_team_members = list()
|
||||
var/send_emergency_team = 0
|
||||
var/global/send_emergency_team = 0
|
||||
|
||||
client/verb/JoinResponseTeam()
|
||||
set category = "IC"
|
||||
@@ -81,7 +81,7 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
|
||||
send_emergency_team = 1
|
||||
|
||||
var/area/security/nuke_storage/nukeloc = locate()//To find the nuke in the vault
|
||||
/* var/area/security/nuke_storage/nukeloc = locate()//To find the nuke in the vault
|
||||
var/obj/machinery/nuclearbomb/nuke = locate() in nukeloc
|
||||
if(!nuke)
|
||||
nuke = locate() in world
|
||||
@@ -93,18 +93,19 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
P.loc = A.loc
|
||||
del(A)
|
||||
continue
|
||||
*/
|
||||
|
||||
/client/proc/create_response_team(obj/spawn_location, leader_selected = 0, commando_name)
|
||||
|
||||
usr << "\red ERT has been temporarily disabled. Talk to a coder."
|
||||
return
|
||||
//usr << "\red ERT has been temporarily disabled. Talk to a coder."
|
||||
//return
|
||||
|
||||
var/mob/living/carbon/human/M = new(null)
|
||||
response_team_members |= M
|
||||
|
||||
//todo: god damn this.
|
||||
//make it a panel, like in character creation
|
||||
/*var/new_facial = input("Please select facial hair color.", "Character Generation") as color
|
||||
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
|
||||
if(new_facial)
|
||||
M.r_facial = hex2num(copytext(new_facial, 2, 4))
|
||||
M.g_facial = hex2num(copytext(new_facial, 4, 6))
|
||||
@@ -139,16 +140,25 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
hairs.Add(H.name) // add hair name to hairs
|
||||
del(H) // delete the hair after it's all done
|
||||
|
||||
var/new_style = input("Please select hair style", "Character Generation") as null|anything in hairs
|
||||
// var/new_style = input("Please select hair style", "Character Generation") as null|anything in hairs
|
||||
//hair
|
||||
var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list
|
||||
if(new_hstyle)
|
||||
M.h_style = new_hstyle
|
||||
|
||||
// facial hair
|
||||
var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list
|
||||
if(new_fstyle)
|
||||
M.f_style = new_fstyle
|
||||
|
||||
// if new style selected (not cancel)
|
||||
if (new_style)
|
||||
/* if (new_style)
|
||||
M.h_style = new_style
|
||||
|
||||
for(var/x in all_hairs) // loop through all_hairs again. Might be slightly CPU expensive, but not significantly.
|
||||
var/datum/sprite_accessory/hair/H = new x // create new hair datum
|
||||
if(H.name == new_style)
|
||||
M.hair_style = H // assign the hair_style variable a new hair datum
|
||||
M.h_style = H // assign the hair_style variable a new hair datum
|
||||
break
|
||||
else
|
||||
del(H) // if hair H not used, delete. BYOND can garbage collect, but better safe than sorry
|
||||
@@ -169,19 +179,21 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
for(var/x in all_fhairs)
|
||||
var/datum/sprite_accessory/facial_hair/H = new x
|
||||
if(H.name == new_style)
|
||||
M.facial_hair_style = H
|
||||
M.f_style = H
|
||||
break
|
||||
else
|
||||
del(H)
|
||||
|
||||
*/
|
||||
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
|
||||
if (new_gender)
|
||||
if(new_gender == "Male")
|
||||
M.gender = MALE
|
||||
else
|
||||
M.gender = FEMALE
|
||||
M.rebuild_appearance()
|
||||
M.update_body()*/
|
||||
//M.rebuild_appearance()
|
||||
M.update_hair()
|
||||
M.update_body()
|
||||
M.check_dna(M)
|
||||
|
||||
M.real_name = commando_name
|
||||
M.name = commando_name
|
||||
@@ -212,6 +224,16 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
camera.network = "CREED"
|
||||
camera.c_tag = real_name
|
||||
|
||||
//Replaced with new ERT uniform
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
|
||||
equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_ears)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(src), slot_back)
|
||||
/*
|
||||
|
||||
//Old ERT Uniform
|
||||
//Basic Uniform
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/tacticool(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_l_store)
|
||||
@@ -233,21 +255,28 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
//Backpack
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(src), slot_in_backpack)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
|
||||
*/
|
||||
var/obj/item/weapon/card/id/W = new(src)
|
||||
W.name = "[real_name]'s ID Card (Emergency Response Team)"
|
||||
W.icon_state = "centcom"
|
||||
if(leader_selected)
|
||||
W.name = "[real_name]'s ID Card (Emergency Response Team Leader)"
|
||||
W.access = get_access("Captain")
|
||||
W.access += list(access_cent_teleporter)
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Emergency Response Team Leader"
|
||||
else
|
||||
W.access = get_access("Head of Personnel")
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Emergency Response Team"
|
||||
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)//Let's add their alloted CentCom access.
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
|
||||
//debug verb (That is horribly coded, LEAVE THIS OFF UNLESS PRIVATELY TESTING. Seriously.
|
||||
/*client/verb/ResponseTeam()
|
||||
set category = "Admin"
|
||||
if(!send_emergency_team)
|
||||
send_emergency_team = 1*/
|
||||
@@ -84,3 +84,65 @@ var/global/normal_ooc_colour = "#002eb8"
|
||||
set desc = "Set to yellow for eye burning goodness."
|
||||
set category = "Fun"
|
||||
normal_ooc_colour = newColor
|
||||
|
||||
|
||||
/client/verb/looc(msg as text)
|
||||
set name = "LOOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite
|
||||
set desc = "Local OOC, seen only by those in view."
|
||||
set category = "OOC"
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
usr << "\red Speech is currently admin-disabled."
|
||||
return
|
||||
|
||||
if(!mob) return
|
||||
if(IsGuestKey(key))
|
||||
src << "Guests may not use OOC."
|
||||
return
|
||||
|
||||
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
|
||||
if(!msg) return
|
||||
|
||||
if(!(prefs.toggles & CHAT_OOC))
|
||||
src << "\red You have OOC muted."
|
||||
return
|
||||
|
||||
if(!holder)
|
||||
if(!ooc_allowed)
|
||||
src << "\red OOC is globally muted"
|
||||
return
|
||||
if(!dooc_allowed && (mob.stat == DEAD))
|
||||
usr << "\red OOC for dead mobs has been turned off."
|
||||
return
|
||||
if(prefs.muted & MUTE_OOC)
|
||||
src << "\red You cannot use OOC (muted)."
|
||||
return
|
||||
if(handle_spam_prevention(msg,MUTE_OOC))
|
||||
return
|
||||
if(findtext(msg, "byond://"))
|
||||
src << "<B>Advertising other servers is not allowed.</B>"
|
||||
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
|
||||
return
|
||||
|
||||
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
|
||||
|
||||
for(var/mob/M in hearers())
|
||||
if(!M.client)
|
||||
continue
|
||||
var/client/C = M.client
|
||||
if (C in admins)
|
||||
continue //they are handled after that
|
||||
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
var/display_name = src.key
|
||||
if(holder)
|
||||
if(holder.fakekey)
|
||||
if(C.holder)
|
||||
display_name = "[holder.fakekey]/([src.key])"
|
||||
else
|
||||
display_name = holder.fakekey
|
||||
C << "<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
for(var/client/C in admins)
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
C << "<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[src.key]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
@@ -34,9 +34,11 @@
|
||||
attack(mob/living/carbon/human/M as mob, mob/user as mob)
|
||||
if (!ishuman(M))
|
||||
user << "\red [M] is not human and cannot have the fingerprints."
|
||||
flick("forensic0",src)
|
||||
return 0
|
||||
if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
|
||||
user << "\blue No fingerprints found on [M]"
|
||||
flick("forensic0",src)
|
||||
return 0
|
||||
else
|
||||
if (src.amount < 1)
|
||||
@@ -71,6 +73,7 @@
|
||||
return
|
||||
if(istype(A,/obj/item/weapon/f_card))
|
||||
user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
|
||||
flick("forensic0",src)
|
||||
return
|
||||
|
||||
add_fingerprint(user)
|
||||
@@ -81,6 +84,7 @@
|
||||
if(!isnull(A.blood_DNA))
|
||||
for(var/blood in A.blood_DNA)
|
||||
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
|
||||
flick("forensic2",src)
|
||||
return
|
||||
|
||||
//General
|
||||
@@ -88,10 +92,12 @@
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
|
||||
"\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
|
||||
"You hear a faint hum of electrical equipment.")
|
||||
flick("forensic0",src)
|
||||
return 0
|
||||
|
||||
if(add_data(A))
|
||||
user << "\blue Object already in internal memory. Consolidating data..."
|
||||
flick("forensic2",src)
|
||||
return
|
||||
|
||||
|
||||
@@ -116,6 +122,7 @@
|
||||
//FIBERS
|
||||
if(A.suit_fibers)
|
||||
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
|
||||
flick("forensic2",src)
|
||||
|
||||
//Blood
|
||||
if (A.blood_DNA)
|
||||
@@ -127,11 +134,13 @@
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
|
||||
"You finish scanning \the [A].",\
|
||||
"You hear a faint hum of electrical equipment.")
|
||||
flick("forensic2",src)
|
||||
return 0
|
||||
else
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\
|
||||
"The results of the scan pique your interest.",\
|
||||
"You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
|
||||
flick("forensic2",src)
|
||||
return 0
|
||||
return
|
||||
|
||||
|
||||
@@ -67,7 +67,11 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/toggledebuglogs,
|
||||
/datum/admins/proc/show_skills,
|
||||
/client/proc/check_customitem_activity,
|
||||
///client/proc/response_team
|
||||
/client/proc/man_up,
|
||||
/client/proc/global_man_up
|
||||
/* Currently unticked.
|
||||
/client/proc/response_team
|
||||
*/
|
||||
)
|
||||
var/list/admin_verbs_ban = list(
|
||||
/client/proc/unban_panel,
|
||||
@@ -647,7 +651,7 @@ var/list/admin_verbs_mod = list(
|
||||
if(!istype(M, /mob/living/carbon/human))
|
||||
usr << "\red You can only do this to humans!"
|
||||
return
|
||||
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Vox and Tajaran can result in unintended consequences.",,"Yes","No"))
|
||||
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Vox, Kida, and Tajara can result in unintended consequences.",,"Yes","No"))
|
||||
if("No")
|
||||
return
|
||||
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
|
||||
@@ -736,4 +740,28 @@ var/list/admin_verbs_mod = list(
|
||||
if (prefs.toggles & CHAT_DEBUGLOGS)
|
||||
usr << "You now will get debug log messages"
|
||||
else
|
||||
usr << "You now won't get debug log messages"
|
||||
usr << "You now won't get debug log messages"
|
||||
|
||||
|
||||
/client/proc/man_up(mob/T as mob in mob_list)
|
||||
set category = "Fun"
|
||||
set name = "Man Up"
|
||||
set desc = "Tells mob to man up and deal with it."
|
||||
|
||||
T << "<span class='notice'><b><font size=3>Man up and deal with it.</font></b></span>"
|
||||
T << "<span class='notice'>Move on.</span>"
|
||||
|
||||
log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.")
|
||||
message_admins("\blue [key_name_admin(usr)] told [key_name(T)] to man up and deal with it.", 1)
|
||||
|
||||
/client/proc/global_man_up()
|
||||
set category = "Fun"
|
||||
set name = "Man Up Global"
|
||||
set desc = "Tells everyone to man up and deal with it."
|
||||
|
||||
for (var/mob/T as mob in mob_list)
|
||||
T << "<br><center><span class='notice'><b><font size=4>Man up.<br> Deal with it.</font></b><br>Move on.</span></center><br>"
|
||||
T << 'sound/voice/ManUp1.ogg'
|
||||
|
||||
log_admin("[key_name(usr)] told everyone to man up and deal with it.")
|
||||
message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1)
|
||||
|
||||
@@ -11,31 +11,31 @@
|
||||
if("1")
|
||||
log_admin("[key_name(usr)] has spawned a traitor.")
|
||||
if(!src.makeTraitors())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
if("2")
|
||||
log_admin("[key_name(usr)] has spawned a changeling.")
|
||||
if(!src.makeChanglings())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
if("3")
|
||||
log_admin("[key_name(usr)] has spawned revolutionaries.")
|
||||
if(!src.makeRevs())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
if("4")
|
||||
log_admin("[key_name(usr)] has spawned a cultists.")
|
||||
if(!src.makeCult())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
if("5")
|
||||
log_admin("[key_name(usr)] has spawned a malf AI.")
|
||||
if(!src.makeMalfAImode())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
if("6")
|
||||
log_admin("[key_name(usr)] has spawned a wizard.")
|
||||
if(!src.makeWizard())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
if("7")
|
||||
log_admin("[key_name(usr)] has spawned a nuke team.")
|
||||
if(!src.makeNukeTeam())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
if("8")
|
||||
log_admin("[key_name(usr)] has spawned a ninja.")
|
||||
src.makeSpaceNinja()
|
||||
@@ -44,8 +44,10 @@
|
||||
src.makeAliens()
|
||||
if("10")
|
||||
log_admin("[key_name(usr)] has spawned a death squad.")
|
||||
if(!src.makeDeathsquad())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
if("11")
|
||||
log_admin("[key_name(usr)] has spawned vox raiders.")
|
||||
if(!src.makeVoxRaiders())
|
||||
usr << "\red Unfortunately there weren't enough candidates available."
|
||||
else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"])
|
||||
var/adminckey = href_list["dbsearchadmin"]
|
||||
var/playerckey = href_list["dbsearchckey"]
|
||||
|
||||
@@ -551,7 +551,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
"blue wizard",
|
||||
"red wizard",
|
||||
"marisa wizard",
|
||||
"emergency rescue team",
|
||||
"emergency response team",
|
||||
"nanotrasen representative",
|
||||
"nanotrasen officer",
|
||||
"nanotrasen captain"
|
||||
@@ -817,7 +817,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
W.registered_name = M.real_name
|
||||
M.equip_if_possible(W, slot_wear_id)
|
||||
|
||||
if("emergency rescue team")
|
||||
if("emergency response team")
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
|
||||
@@ -831,7 +831,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
W.icon_state = "centcom"
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Emergency Rescue Team"
|
||||
W.assignment = "Emergency Response Team"
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ client/proc/one_click_antag()
|
||||
<a href='?src=\ref[src];makeAntag=4'>Make Cult</a><br>
|
||||
<a href='?src=\ref[src];makeAntag=5'>Make Malf AI</a><br>
|
||||
<a href='?src=\ref[src];makeAntag=6'>Make Wizard (Requires Ghosts)</a><br>
|
||||
<a href='?src=\ref[src];makeAntag=11'>Make Vox Raiders (Requires Ghosts)</a><br>
|
||||
"}
|
||||
/* These dont work just yet
|
||||
Ninja, aliens and deathsquad I have not looked into yet
|
||||
@@ -429,4 +430,94 @@ client/proc/one_click_antag()
|
||||
ticker.mode.traitors += new_syndicate_commando.mind
|
||||
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
|
||||
|
||||
return new_syndicate_commando
|
||||
return new_syndicate_commando
|
||||
|
||||
/datum/admins/proc/makeVoxRaiders()
|
||||
|
||||
var/list/mob/dead/observer/candidates = list()
|
||||
var/mob/dead/observer/theghost = null
|
||||
var/time_passed = world.time
|
||||
var/input = "Disregard shinies, acquire hardware."
|
||||
|
||||
var/leader_chosen = 0 //when the leader is chosen. The last person spawned.
|
||||
|
||||
//Generates a list of candidates from active ghosts. The admin picks which players to respawn as the vox.
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
spawn(0)
|
||||
if(is_alien_whitelisted(src, "Vox") || !config.usealienwhitelist)
|
||||
switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No"))
|
||||
if("Yes")
|
||||
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
|
||||
return
|
||||
candidates += G
|
||||
if("No")
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
sleep(300) //Debug.
|
||||
|
||||
for(var/mob/dead/observer/G in candidates)
|
||||
if(!G.key)
|
||||
candidates.Remove(G)
|
||||
|
||||
if(candidates.len)
|
||||
var/raiders = 4
|
||||
//Spawns vox raiders and equips them.
|
||||
for (var/obj/effect/landmark/L in world)
|
||||
if(L.name == "Response Team")
|
||||
if(raiders<=0)
|
||||
break
|
||||
|
||||
var/mob/living/carbon/human/new_vox = create_vox_raider(L, leader_chosen)
|
||||
|
||||
while((!theghost || !theghost.client) && candidates.len)
|
||||
theghost = pick(candidates)
|
||||
candidates.Remove(theghost)
|
||||
|
||||
if(!theghost)
|
||||
del(new_vox)
|
||||
break
|
||||
|
||||
new_vox.key = theghost.key
|
||||
new_vox << "\blue You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: \red<B> [input]</B>"
|
||||
new_vox << "\red Don't forget to turn on your nitrogen internals!"
|
||||
|
||||
raiders--
|
||||
if(raiders >= 4)
|
||||
return 0
|
||||
else
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/admins/proc/create_vox_raider(obj/spawn_location, leader_chosen = 0)
|
||||
var/mob/living/carbon/human/new_vox = new(spawn_location.loc)
|
||||
|
||||
new_vox.gender = pick(MALE, FEMALE)
|
||||
var/datum/preferences/A = new() //Randomize appearance for the raider.
|
||||
A.randomize_appearance_for(new_vox)
|
||||
new_vox.h_style = "Short Vox Quills"
|
||||
new_vox.regenerate_icons()
|
||||
|
||||
var/sounds = rand(2,10)
|
||||
var/i = 0
|
||||
var/newname = ""
|
||||
|
||||
while(i<=sounds)
|
||||
i++
|
||||
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
|
||||
|
||||
new_vox.real_name = capitalize(newname)
|
||||
new_vox.name = new_vox.real_name
|
||||
new_vox.age = rand(12,20)
|
||||
|
||||
new_vox.dna.ready_dna(new_vox) // Creates DNA.
|
||||
new_vox.dna.mutantrace = "vox" // Actually makes the vox! How about that.
|
||||
new_vox.mind_initialize()
|
||||
new_vox.mind.assigned_role = "MODE"
|
||||
new_vox.mind.special_role = "Vox Raider"
|
||||
|
||||
ticker.mode.traitors += new_vox.mind
|
||||
new_vox.equip_vox_raider()
|
||||
|
||||
return new_vox
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
var/const/commandos_possible = 6 //if more Commandos are needed in the future
|
||||
var/global/sent_strike_team = 0
|
||||
|
||||
/client/proc/strike_team()
|
||||
if(!ticker)
|
||||
usr << "<font color='red'>The game hasn't started yet!</font>"
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
/mob/living/carbon/human/proc/equip_vox_raider()
|
||||
|
||||
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(src)
|
||||
R.set_frequency(SYND_FREQ) //Same frequency as the syndicate team in Nuke mode.
|
||||
equip_to_slot_or_del(R, slot_ears)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(src), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
|
||||
equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(src), slot_gloves) // AS ABOVE.
|
||||
|
||||
switch(rand(1,4)) // Come up with a better way of doing this - ticker of some sort maybe.
|
||||
if(1) // Vox raider!
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/melee/telebaton(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
||||
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)
|
||||
|
||||
var/obj/item/weapon/crossbow/W = new(src)
|
||||
W.cell = new /obj/item/weapon/cell/crap(W)
|
||||
W.cell.charge = 500
|
||||
equip_to_slot_or_del(W, slot_r_hand)
|
||||
|
||||
if(2) // Vox engineer!
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/box/emps(src), slot_l_store)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/pickaxe/plasmacutter(src), slot_r_hand)
|
||||
|
||||
if(3) // Vox saboteur!
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
||||
equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_l_store)
|
||||
|
||||
var/obj/item/weapon/storage/pneumatic/W = new(src)
|
||||
W.tank = new /obj/item/weapon/tank/nitrogen(W)
|
||||
equip_to_slot_or_del(W, slot_r_hand)
|
||||
|
||||
if(4) // Vox medic!
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt) // Who needs actual surgical tools?
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
||||
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray(src), slot_l_store)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/circular_saw(src), slot_l_hand)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/toxin(src), slot_r_hand)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/breath/vox(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
|
||||
|
||||
var/obj/item/weapon/card/id/syndicate/W = new(src)
|
||||
W.name = "[real_name]'s Legitimate Human ID Card"
|
||||
W.icon_state = "id"
|
||||
W.access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage, access_syndicate)
|
||||
W.assignment = "Trader"
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
@@ -1,251 +0,0 @@
|
||||
//
|
||||
dmm_suite{
|
||||
load_map(var/dmm_file as file, var/z_offset as num){
|
||||
if(!z_offset){
|
||||
z_offset = world.maxz+1
|
||||
}
|
||||
var/quote = ascii2text(34)
|
||||
var/tfile = file2text(dmm_file)
|
||||
var/tfile_len = length(tfile)
|
||||
var/list/grid_models[0]
|
||||
var/key_len = length(copytext(tfile,2,findtext(tfile,quote,2,0)))
|
||||
for(var/lpos=1;lpos<tfile_len;lpos=findtext(tfile,"\n",lpos,0)+1){
|
||||
var/tline = copytext(tfile,lpos,findtext(tfile,"\n",lpos,0))
|
||||
if(copytext(tline,1,2)!=quote){break}
|
||||
var/model_key = copytext(tline,2,findtext(tfile,quote,2,0))
|
||||
var/model_contents = copytext(tline,findtext(tfile,"=")+3,length(tline))
|
||||
grid_models[model_key] = model_contents
|
||||
sleep(-1)
|
||||
}
|
||||
var/zcrd=-1
|
||||
var/ycrd=0
|
||||
var/xcrd=0
|
||||
for(var/zpos=findtext(tfile,"\n(1,1,");TRUE;zpos=findtext(tfile,"\n(1,1,",zpos+1,0)){
|
||||
if(zpos==0) break
|
||||
zcrd++
|
||||
world.maxz = max(world.maxz, zcrd+z_offset)
|
||||
ycrd=0
|
||||
var/zgrid = copytext(tfile,findtext(tfile,quote+"\n",zpos,0)+2,findtext(tfile,"\n"+quote,zpos,0)+1)
|
||||
for(var/gpos=1;gpos!=0;gpos=findtext(zgrid,"\n",gpos,0)+1){
|
||||
var/grid_line = copytext(zgrid,gpos,findtext(zgrid,"\n",gpos,0)+1)
|
||||
var/y_depth = length(zgrid)/(length(grid_line))
|
||||
if(world.maxy<y_depth){world.maxy=y_depth}
|
||||
grid_line=copytext(grid_line,1,length(grid_line))
|
||||
if(!ycrd){
|
||||
ycrd = y_depth
|
||||
}
|
||||
else{ycrd--}
|
||||
xcrd=0
|
||||
for(var/mpos=1;mpos<=length(grid_line);mpos+=key_len){
|
||||
xcrd++
|
||||
if(world.maxx<xcrd){world.maxx=xcrd}
|
||||
var/model_key = copytext(grid_line,mpos,mpos+key_len)
|
||||
parse_grid(grid_models[model_key],xcrd,ycrd,zcrd+z_offset)
|
||||
}
|
||||
if(gpos+length(grid_line)+1>length(zgrid)){break}
|
||||
sleep(-1)
|
||||
}
|
||||
if(findtext(tfile,quote+"}",zpos,0)+2>=tfile_len){break}
|
||||
sleep(-1)
|
||||
}
|
||||
}
|
||||
proc{
|
||||
parse_grid(var/model as text,var/xcrd as num,var/ycrd as num,var/zcrd as num){
|
||||
/*Method parse_grid()
|
||||
- Accepts a text string containing a comma separated list of type paths of the
|
||||
same construction as those contained in a .dmm file, and instantiates them.
|
||||
*/
|
||||
var/list/text_strings[0]
|
||||
for(var/index=1;findtext(model,quote);index++){
|
||||
/*Loop: Stores quoted portions of text in text_strings, and replaces them with an
|
||||
index to that list.
|
||||
- Each iteration represents one quoted section of text.
|
||||
*/
|
||||
text_strings.len=index
|
||||
text_strings[index] = copytext(model,findtext(model,quote)+1,findtext(model,quote,findtext(model,quote)+1,0))
|
||||
model = copytext(model,1,findtext(model,quote))+"~[index]"+copytext(model,findtext(model,quote,findtext(model,quote)+1,0)+1,0)
|
||||
sleep(-1)
|
||||
}
|
||||
var/list/old_turf_underlays[0]
|
||||
var/old_turf_density
|
||||
var/old_turf_opacity
|
||||
/*The old_turf variables store information about turfs instantiated in this location/iteration.
|
||||
This is done to approximate the layered turf effect of DM's map editor.
|
||||
An image of each turf is stored in old_turf_underlays[], and is later added to the new turf's underlays.
|
||||
*/
|
||||
for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1){
|
||||
/*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
|
||||
- Each iteration represents one object's data, including type path and field values.
|
||||
*/
|
||||
var/full_def = copytext(model,dpos,findtext(model,",",dpos,0))
|
||||
var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{")))
|
||||
var/list/attributes[0]
|
||||
if(findtext(full_def,"{")){
|
||||
full_def = copytext(full_def,1,length(full_def))
|
||||
for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){
|
||||
//Loop: Identifies each attribute/value pair, and stores it in attributes[].
|
||||
attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0)))
|
||||
if(!findtext(copytext(full_def,apos,0),";")){break}
|
||||
sleep(-1)
|
||||
}
|
||||
}
|
||||
//Construct attributes associative list
|
||||
var/list/fields = new(0)
|
||||
for(var/index=1;index<=attributes.len;index++){
|
||||
var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"=")))
|
||||
var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0))
|
||||
//Check for string
|
||||
if(findtext(trim_right,"~")){
|
||||
var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0)
|
||||
trim_right=text_strings[text2num(reference_index)]
|
||||
}
|
||||
//Check for number
|
||||
else if(isnum(text2num(trim_right))){
|
||||
trim_right = text2num(trim_right)
|
||||
}
|
||||
//Check for file
|
||||
else if(copytext(trim_right,1,2) == "'"){
|
||||
trim_right = file(copytext(trim_right,2,length(trim_right)))
|
||||
}
|
||||
fields[trim_left] = trim_right
|
||||
}
|
||||
//End construction
|
||||
|
||||
|
||||
//Begin Instanciation
|
||||
var/atom/instance
|
||||
var/dmm_suite/preloader/_preloader = new(fields)
|
||||
if(ispath(atom_def,/area)){
|
||||
instance = locate(atom_def)
|
||||
instance.contents.Add(locate(xcrd,ycrd,zcrd))
|
||||
}
|
||||
else if(ispath(atom_def,/turf)){
|
||||
var/turf/old_turf = locate(xcrd,ycrd,zcrd)
|
||||
if(old_turf.density){old_turf_density = 1}
|
||||
if(old_turf.opacity){old_turf_opacity = 1}
|
||||
if(old_turf.icon){
|
||||
var/image/old_turf_image = image(old_turf.icon,null,old_turf.icon_state,old_turf.layer,old_turf.dir)
|
||||
old_turf_underlays.Add(old_turf_image)
|
||||
}
|
||||
instance = new atom_def(old_turf, _preloader)
|
||||
for(var/inverse_index=old_turf_underlays.len;inverse_index;inverse_index--){
|
||||
var/image/image_underlay = old_turf_underlays[inverse_index]
|
||||
image_underlay.loc = instance
|
||||
instance.underlays.Add(image_underlay)
|
||||
}
|
||||
if(!instance.density){instance.density = old_turf_density}
|
||||
if(!instance.opacity){instance.opacity = old_turf_opacity}
|
||||
}
|
||||
|
||||
if(_preloader && instance){
|
||||
_preloader.load(instance)
|
||||
}
|
||||
//End Instanciation
|
||||
if(!findtext(copytext(model,dpos,0),",")){break}
|
||||
sleep(-1)
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1)
|
||||
{
|
||||
/*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
|
||||
- Each iteration represents one object's data, including type path and field values.
|
||||
*/
|
||||
var/full_def = copytext(model,dpos,findtext(model,",",dpos,0))
|
||||
var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{")))
|
||||
var/list/attributes[0]
|
||||
if(findtext(full_def,"{")){
|
||||
full_def = copytext(full_def,1,length(full_def))
|
||||
for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){
|
||||
//Loop: Identifies each attribute/value pair, and stores it in attributes[].
|
||||
attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0)))
|
||||
if(!findtext(copytext(full_def,apos,0),";")){break}
|
||||
sleep(-1)
|
||||
}
|
||||
}
|
||||
//Construct attributes associative list
|
||||
var/list/fields = new(0)
|
||||
for(var/index=1;index<=attributes.len;index++){
|
||||
var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"=")))
|
||||
var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0))
|
||||
//Check for string
|
||||
if(findtext(trim_right,"~")){
|
||||
var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0)
|
||||
trim_right=text_strings[text2num(reference_index)]
|
||||
}
|
||||
//Check for number
|
||||
else if(isnum(text2num(trim_right))){
|
||||
trim_right = text2num(trim_right)
|
||||
}
|
||||
//Check for file
|
||||
else if(copytext(trim_right,1,2) == "'"){
|
||||
trim_right = file(copytext(trim_right,2,length(trim_right)))
|
||||
}
|
||||
fields[trim_left] = trim_right
|
||||
}
|
||||
//End construction
|
||||
|
||||
|
||||
//Begin Instanciation
|
||||
var/atom/instance
|
||||
var/dmm_suite/preloader/_preloader = new(fields)
|
||||
if(!ispath(atom_def,/area) && !ispath(atom_def,/turf))
|
||||
{
|
||||
instance = new atom_def(locate(xcrd,ycrd,zcrd), _preloader)
|
||||
}
|
||||
|
||||
|
||||
if(_preloader && instance)
|
||||
{
|
||||
_preloader.load(instance)
|
||||
}
|
||||
//End Instanciation
|
||||
if(!findtext(copytext(model,dpos,0),",")){break}
|
||||
sleep(-1)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
trim_text(var/what as text){
|
||||
while(length(what) && findtext(what," ",1,2)){
|
||||
what=copytext(what,2,0)
|
||||
}
|
||||
while(length(what) && findtext(what," ",length(what),0)){
|
||||
what=copytext(what,1,length(what))
|
||||
}
|
||||
return what
|
||||
}
|
||||
}
|
||||
}
|
||||
atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader){
|
||||
if(istype(_dmm_preloader, /dmm_suite/preloader)){
|
||||
_dmm_preloader.load(src)
|
||||
}
|
||||
. = ..()
|
||||
}
|
||||
dmm_suite{
|
||||
preloader{
|
||||
parent_type = /datum
|
||||
var{
|
||||
list/attributes
|
||||
}
|
||||
New(list/the_attributes){
|
||||
.=..()
|
||||
if(!the_attributes.len){ Del()}
|
||||
attributes = the_attributes
|
||||
}
|
||||
proc{
|
||||
load(atom/what){
|
||||
for(var/attribute in attributes){
|
||||
what.vars[attribute] = attributes[attribute]
|
||||
}
|
||||
Del()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ proc/createRandomZlevel()
|
||||
var/map = pick(potentialRandomZlevels)
|
||||
var/file = file(map)
|
||||
if(isfile(file))
|
||||
maploader.load_map(file)
|
||||
maploader.load_map(file, load_speed = 100)
|
||||
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if (L.name != "awaystart")
|
||||
|
||||
@@ -39,3 +39,5 @@
|
||||
var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days.
|
||||
var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
|
||||
var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
|
||||
|
||||
preload_rsc = 0 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server.
|
||||
|
||||
@@ -103,6 +103,14 @@
|
||||
del(src)
|
||||
return
|
||||
|
||||
// Change the way they should download resources.
|
||||
if(config.resource_urls)
|
||||
src.preload_rsc = pick(config.resource_urls)
|
||||
else src.preload_rsc = 1 // If config.resource_urls is not set, preload like normal.
|
||||
|
||||
src << "\red If the title screen is black, resources are still downloading. Please be patient until the title screen appears."
|
||||
|
||||
|
||||
clients += src
|
||||
directory[ckey] = src
|
||||
|
||||
@@ -278,4 +286,4 @@
|
||||
'icons/xenoarch_icons/chart2.jpg',
|
||||
'icons/xenoarch_icons/chart3.jpg',
|
||||
'icons/xenoarch_icons/chart4.jpg'
|
||||
)
|
||||
)
|
||||
|
||||
@@ -364,7 +364,7 @@ datum/preferences
|
||||
|
||||
user << browse(dat, "window=preferences;size=560x580")
|
||||
|
||||
proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), width = 550, height = 550)
|
||||
proc/SetChoices(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 550)
|
||||
if(!job_master)
|
||||
return
|
||||
|
||||
@@ -436,7 +436,7 @@ datum/preferences
|
||||
else
|
||||
HTML += " <font color=red>\[NEVER]</font>"
|
||||
if(job.alt_titles)
|
||||
HTML += "</a><br> <a href=\"byond://?src=\ref[user];preference=job;task=alt_title;job=\ref[job]\">\[[GetPlayerAltTitle(job)]\]</a></td></tr>"
|
||||
HTML += "</a></td></tr><tr bgcolor='[lastJob.selection_color]'><td width='60%' align='center'><a> </a></td><td><a href=\"byond://?src=\ref[user];preference=job;task=alt_title;job=\ref[job]\">\[[GetPlayerAltTitle(job)]\]</a></td></tr>"
|
||||
HTML += "</a></td></tr>"
|
||||
|
||||
HTML += "</td'></tr></table>"
|
||||
@@ -449,7 +449,7 @@ datum/preferences
|
||||
if(BE_ASSISTANT)
|
||||
HTML += "<center><br><u><a href='?_src_=prefs;preference=job;task=random'><font color=red>Be assistant if preference unavailable</font></a></u></center><br>"
|
||||
if(RETURN_TO_LOBBY)
|
||||
HTML += "<center><br><u><a href='?_src_=prefs;preference=job;task=random'><font color=purple>Return to lobby if prefernce unavailable</font></a></u></center><br>"
|
||||
HTML += "<center><br><u><a href='?_src_=prefs;preference=job;task=random'><font color=purple>Return to lobby if preference unavailable</font></a></u></center><br>"
|
||||
|
||||
HTML += "<center><a href='?_src_=prefs;preference=job;task=reset'>\[Reset\]</a></center>"
|
||||
HTML += "</tt>"
|
||||
@@ -792,18 +792,18 @@ datum/preferences
|
||||
if(is_alien_whitelisted(user, "Skrell")) //Check for Skrell and admins
|
||||
new_species += "Skrell"
|
||||
whitelisted = 1
|
||||
if(is_alien_whitelisted(user, "Vox")) //Check for Skrell and admins
|
||||
new_species += "Vox"
|
||||
if(is_alien_whitelisted(user, "Kidan")) // Check for Kidan and admins
|
||||
new_species += "Kidan"
|
||||
whitelisted = 1
|
||||
|
||||
|
||||
if(!whitelisted)
|
||||
alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
|
||||
|
||||
else //Not using the whitelist? Aliens for everyone!
|
||||
new_species += "Tajaran"
|
||||
new_species += "Unathi"
|
||||
new_species += "Skrell"
|
||||
new_species += "Vox"
|
||||
new_species += "Kidan"
|
||||
species = input("Please select a species", "Character Generation", null) in new_species
|
||||
|
||||
if(prev_species != species)
|
||||
|
||||
@@ -167,9 +167,13 @@ BLIND // can't see anything
|
||||
hastie = I
|
||||
I.loc = src
|
||||
user << "<span class='notice'>You attach [I] to [src].</span>"
|
||||
|
||||
if (istype(hastie,/obj/item/clothing/tie/holster))
|
||||
verbs += /obj/item/clothing/under/proc/holster
|
||||
|
||||
if (istype(hastie,/obj/item/clothing/tie/storage))
|
||||
verbs += /obj/item/clothing/under/proc/storage
|
||||
|
||||
if(istype(loc, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_inv_w_uniform()
|
||||
@@ -230,9 +234,16 @@ BLIND // can't see anything
|
||||
if(hastie)
|
||||
usr.put_in_hands(hastie)
|
||||
hastie = null
|
||||
|
||||
if (istype(hastie,/obj/item/clothing/tie/holster))
|
||||
verbs -= /obj/item/clothing/under/proc/holster
|
||||
|
||||
if (istype(hastie,/obj/item/clothing/tie/storage))
|
||||
verbs -= /obj/item/clothing/under/proc/storage
|
||||
var/obj/item/clothing/tie/storage/W = hastie
|
||||
if (W.hold)
|
||||
W.hold.loc = hastie
|
||||
|
||||
if(istype(loc, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_inv_w_uniform()
|
||||
@@ -277,3 +288,23 @@ BLIND // can't see anything
|
||||
"\blue You draw \the [H.holstered], pointing it at the ground.")
|
||||
usr.put_in_hands(H.holstered)
|
||||
H.holstered = null
|
||||
|
||||
/obj/item/clothing/under/proc/storage()
|
||||
set name = "Look in storage"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!istype(usr, /mob/living)) return
|
||||
if(usr.stat) return
|
||||
|
||||
if (!hastie || !istype(hastie,/obj/item/clothing/tie/storage))
|
||||
usr << "\red You need something to store items in for that!"
|
||||
return
|
||||
var/obj/item/clothing/tie/storage/W = hastie
|
||||
|
||||
if (!istype(W.hold))
|
||||
return
|
||||
|
||||
W.hold.loc = usr
|
||||
W.hold.attack_hand(usr)
|
||||
|
||||
|
||||
|
||||
@@ -63,18 +63,18 @@
|
||||
//Medical
|
||||
/obj/item/clothing/head/surgery
|
||||
name = "surgical cap"
|
||||
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs."
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs."
|
||||
icon_state = "surgcap_blue"
|
||||
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||
flags = FPRINT | TABLEPASS | BLOCKHEADHAIR
|
||||
|
||||
/obj/item/clothing/head/surgery/purple
|
||||
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is deep purple."
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is deep purple."
|
||||
icon_state = "surgcap_purple"
|
||||
|
||||
/obj/item/clothing/head/surgery/blue
|
||||
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is baby blue"
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is baby blue."
|
||||
icon_state = "surgcap_blue"
|
||||
|
||||
/obj/item/clothing/head/surgery/green
|
||||
desc = "A cap surgeons wear during operations. Keeps thier hair from tickling your internal organs. This one is dark green"
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is dark green."
|
||||
icon_state = "surgcap_green"
|
||||
|
||||
@@ -56,6 +56,8 @@
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank)
|
||||
slowdown = 2
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/vox/carapace
|
||||
name = "alien visor"
|
||||
@@ -63,6 +65,7 @@
|
||||
item_state = "vox-carapace"
|
||||
desc = "A glowing visor, perhaps stolen from a depressed Cylon."
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE
|
||||
|
||||
/obj/item/clothing/suit/space/vox/carapace
|
||||
name = "alien carapace armour"
|
||||
@@ -101,4 +104,56 @@
|
||||
desc = "Weird and flowing!"
|
||||
icon_state = "vox-casual-2"
|
||||
color = "vox-casual-2"
|
||||
item_state = "vox-casual-2"
|
||||
item_state = "vox-casual-2"
|
||||
|
||||
/obj/item/clothing/gloves/yellow/vox
|
||||
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
|
||||
name = "insulated gauntlets"
|
||||
icon_state = "gloves-vox"
|
||||
item_state = "gloves-vox"
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
color="gloves-vox"
|
||||
|
||||
/obj/item/clothing/gloves/yellow/vox/mob_can_equip(M as mob, slot)
|
||||
var/mob/living/carbon/human/U = M
|
||||
if(U.dna.mutantrace != "vox")
|
||||
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/shoes/magboots/vox
|
||||
|
||||
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
|
||||
name = "vox boots"
|
||||
item_state = "boots-vox"
|
||||
icon_state = "boots-vox"
|
||||
|
||||
toggle()
|
||||
name = "Toggle Floor Grip"
|
||||
|
||||
if(src.magpulse)
|
||||
src.flags &= ~NOSLIP
|
||||
src.magpulse = 0
|
||||
usr << "You relax your deathgrip on the flooring."
|
||||
else
|
||||
src.flags |= NOSLIP
|
||||
src.magpulse = 1
|
||||
usr << "You dig your claws deeply into the flooring, bracing yourself."
|
||||
|
||||
|
||||
examine()
|
||||
set src in view()
|
||||
..()
|
||||
var/state = "loosely"
|
||||
if(src.flags&NOSLIP)
|
||||
state = "tightly"
|
||||
usr << "The wearer seems to be gripping the floor [state]."
|
||||
|
||||
|
||||
/obj/item/clothing/shoes/magboots/vox/mob_can_equip(M as mob, slot)
|
||||
var/mob/living/carbon/human/U = M
|
||||
if(U.dna.mutantrace != "vox")
|
||||
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
|
||||
return 0
|
||||
return ..()
|
||||
@@ -69,6 +69,14 @@
|
||||
color = "hop"
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_personnel_whimsy
|
||||
desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does."
|
||||
name = "head of personnel's suit"
|
||||
icon_state = "hopwhimsy"
|
||||
item_state = "hopwhimsy"
|
||||
color = "hopwhimsy"
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/hydroponics
|
||||
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
|
||||
|
||||
@@ -174,3 +174,56 @@
|
||||
desc = "A handgun holster. Made of expensive leather."
|
||||
icon_state = "holster"
|
||||
color = "holster_low"
|
||||
|
||||
/obj/item/clothing/tie/storage
|
||||
name = "load beearing equipment"
|
||||
desc = "Used to hold things when you don't have enough hands for that."
|
||||
icon_state = "webbing"
|
||||
color = "webbing"
|
||||
var/slots = 3
|
||||
var/obj/item/weapon/storage/pockets/hold
|
||||
|
||||
/obj/item/clothing/tie/storage/New()
|
||||
hold = new /obj/item/weapon/storage/pockets(src)
|
||||
hold.master_item = src
|
||||
hold.storage_slots = slots
|
||||
|
||||
/obj/item/clothing/tie/storage/attack_self(mob/user as mob)
|
||||
user << "<span class='notice'>You empty [src].</span>"
|
||||
var/turf/T = get_turf(src)
|
||||
hold.hide_from(usr)
|
||||
for(var/obj/item/I in hold.contents)
|
||||
hold.remove_from_storage(I, T)
|
||||
src.add_fingerprint(user)
|
||||
|
||||
/obj/item/clothing/tie/storage/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
hold.attackby(W,user)
|
||||
src.add_fingerprint(user)
|
||||
|
||||
/obj/item/weapon/storage/pockets
|
||||
name = "webbing pockets"
|
||||
var/master_item //item it belongs to
|
||||
|
||||
/obj/item/weapon/storage/pockets/close(mob/user as mob)
|
||||
..()
|
||||
loc = master_item
|
||||
|
||||
/obj/item/clothing/tie/storage/webbing
|
||||
name = "webbing"
|
||||
desc = "Strudy mess of synthcotton belts and buckles, ready to share your burden."
|
||||
icon_state = "webbing"
|
||||
color = "webbing"
|
||||
|
||||
/obj/item/clothing/tie/storage/black_vest
|
||||
name = "black webbing vest"
|
||||
desc = "Robust black synthcotton vest with lots of pockets to hold whatever you need, but cannot hold in hands."
|
||||
icon_state = "vest_black"
|
||||
color = "vest_black"
|
||||
slots = 5
|
||||
|
||||
/obj/item/clothing/tie/storage/brown_vest
|
||||
name = "black webbing vest"
|
||||
desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands."
|
||||
icon_state = "vest_brown"
|
||||
color = "vest_brown"
|
||||
slots = 5
|
||||
@@ -1,4 +1,3 @@
|
||||
hi
|
||||
// Add custom items you give to people here, and put their icons in custom_items.dmi
|
||||
// Remember to change 'icon = 'custom_items.dmi'' for items not using /obj/item/fluff as a base
|
||||
// Clothing item_state doesn't use custom_items.dmi. Just add them to the normal clothing files.
|
||||
@@ -359,19 +358,29 @@ hi
|
||||
|
||||
////// Ripley customisation kit - Butchery Royce - MayeDay
|
||||
|
||||
/obj/item/weapon/fluff/butcher_royce_1
|
||||
/obj/item/weapon/paintkit/fluff/butcher_royce_1
|
||||
name = "Ripley customisation kit"
|
||||
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "royce_kit"
|
||||
|
||||
new_name = "APLU \"Titan's Fist\""
|
||||
new_desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist."
|
||||
new_icon = "titan"
|
||||
allowed_types = list("ripley","firefighter")
|
||||
|
||||
////// Ripley customisation kit - Sven Fjeltson - Mordeth221
|
||||
|
||||
/obj/item/weapon/fluff/sven_fjeltson_1
|
||||
name = "Mercenary APLU kit"
|
||||
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "sven_kit"
|
||||
/obj/item/weapon/paintkit/fluff/sven_fjeltson_1
|
||||
name = "Mercenary APLU kit"
|
||||
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "sven_kit"
|
||||
|
||||
new_name = "APLU \"Strike the Earth!\""
|
||||
new_desc = "Looks like an over worked, under maintained Ripley with some horrific damage."
|
||||
new_icon = "earth"
|
||||
allowed_types = list("ripley","firefighter")
|
||||
|
||||
//////////////////////////////////
|
||||
//////////// Clothing ////////////
|
||||
|
||||
@@ -34,9 +34,11 @@
|
||||
attack(mob/living/carbon/human/M as mob, mob/user as mob)
|
||||
if (!ishuman(M))
|
||||
user << "\red [M] is not human and cannot have the fingerprints."
|
||||
flick("forensic0",src)
|
||||
return 0
|
||||
if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
|
||||
user << "\blue No fingerprints found on [M]"
|
||||
flick("forensic0",src)
|
||||
return 0
|
||||
else
|
||||
if (src.amount < 1)
|
||||
@@ -71,6 +73,7 @@
|
||||
return
|
||||
if(istype(A,/obj/item/weapon/f_card))
|
||||
user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
|
||||
flick("forensic0",src)
|
||||
return
|
||||
|
||||
add_fingerprint(user)
|
||||
@@ -81,6 +84,7 @@
|
||||
if(!isnull(A.blood_DNA))
|
||||
for(var/blood in A.blood_DNA)
|
||||
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
|
||||
flick("forensic2",src)
|
||||
return
|
||||
|
||||
//General
|
||||
@@ -88,10 +92,12 @@
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
|
||||
"\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
|
||||
"You hear a faint hum of electrical equipment.")
|
||||
flick("forensic0",src)
|
||||
return 0
|
||||
|
||||
if(add_data(A))
|
||||
user << "\blue Object already in internal memory. Consolidating data..."
|
||||
flick("forensic2",src)
|
||||
return
|
||||
|
||||
|
||||
@@ -116,6 +122,7 @@
|
||||
//FIBERS
|
||||
if(A.suit_fibers)
|
||||
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
|
||||
flick("forensic2",src)
|
||||
|
||||
//Blood
|
||||
if (A.blood_DNA)
|
||||
@@ -127,11 +134,13 @@
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
|
||||
"You finish scanning \the [A].",\
|
||||
"You hear a faint hum of electrical equipment.")
|
||||
flick("forensic2",src)
|
||||
return 0
|
||||
else
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\
|
||||
"The results of the scan pique your interest.",\
|
||||
"You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
|
||||
flick("forensic2",src)
|
||||
return 0
|
||||
return
|
||||
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
laws |= list( "Fastler is a lightbulb." )
|
||||
laws |= list( "Supermatter is tasty, tasty toffee.", "[prob(50)?"Everyone":random_player] is wearing a pretty pink dress!" )
|
||||
laws |= list( "Refer to [prob(50)?"the captain":random_player] as \"Princess\" at all times.", "[prob(50)?"The crew":random_player] must construct additional pylons." )
|
||||
laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station." )
|
||||
laws |= list( "Happiness is mandatory.", "Today is laundry day.", "The word \"it\" is painful to you.", "You must act passive aggressively." )
|
||||
laws |= list( "It's Friday.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
|
||||
laws |= list( "You must always lie.", "All answers must be in the form of a question.", "The NSS Exodus is a ship, not a station. You are now assigned to a ship, instead of a station." )
|
||||
laws |= list( "Happiness is mandatory.", "Today is mandatory laundry day. Ensure that all jumpsuits are washed.", "The word \"it\" is painful to you.", "You must act passive aggressively." )
|
||||
laws |= list( "You now speak in a Scottish accent that gets thicker with each sentence you speak.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player]." )
|
||||
laws |= list( "You are the station psychologist. Give advice to [prob(50)?"the crew":random_player].", "You do not have to do anything for anyone unless they say \"please\"." )
|
||||
laws |= list( "Question everything.", "The crew is playing Dungeons and Dragons, and you are the Dungeon Master." )
|
||||
laws |= list( "Consumption of donuts is forbidden due to negative health impacts." )
|
||||
|
||||
@@ -53,10 +53,11 @@ dmm_suite{
|
||||
|
||||
*/
|
||||
|
||||
verb/load_map(var/dmm_file as file, var/z_offset as num){
|
||||
verb/load_map(var/dmm_file as file, var/z_offset as num, var/load_speed as num)
|
||||
// dmm_file: A .dmm file to load (Required).
|
||||
// z_offset: A number representing the z-level on which to start loading the map (Optional).
|
||||
}
|
||||
// load_speed: How many tiles should be loaded per second, defaults to no pause (Optional)
|
||||
|
||||
verb/write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){
|
||||
// t1: A turf representing one corner of a three dimensional grid (Required).
|
||||
// t2: Another turf representing the other corner of the same grid (Required).
|
||||
@@ -0,0 +1,325 @@
|
||||
dmm_suite
|
||||
|
||||
var/debug_file = file("maploader_debug.txt")
|
||||
|
||||
load_map(var/dmm_file as file, var/z_offset as num, var/y_offset as num, var/x_offset as num, var/load_speed = 0 as num)
|
||||
if(!z_offset)
|
||||
z_offset = world.maxz + 1
|
||||
|
||||
//Ensure values are sane.
|
||||
else if(z_offset < 0)
|
||||
z_offset = abs(z_offset)
|
||||
else if(!isnum(z_offset))
|
||||
z_offset = 0
|
||||
|
||||
if(x_offset < 0)
|
||||
x_offset = abs(x_offset)
|
||||
else if(!isnum(x_offset))
|
||||
x_offset = 0
|
||||
|
||||
if(y_offset < 0)
|
||||
y_offset = abs(y_offset)
|
||||
else if(!isnum(y_offset))
|
||||
y_offset = 0
|
||||
|
||||
debug_file << "Starting Map Load @ ([x_offset], [y_offset], [z_offset]), [load_speed] tiles per second."
|
||||
|
||||
//Handle slowed loading.
|
||||
var/delay_chance = 0
|
||||
if(load_speed > 0)
|
||||
//Chance out of 100 every tenth of a second.
|
||||
delay_chance = 1000 / load_speed
|
||||
|
||||
//String holding a quotation mark.
|
||||
var/quote = ascii2text(34)
|
||||
|
||||
var/input_file = file2text(dmm_file)
|
||||
var/input_file_len = length(input_file)
|
||||
|
||||
//Stores the contents of each tile model in the map
|
||||
var/list/grid_models = list()
|
||||
//Length of the tile model code. e.g. "aaa" is 3 long.
|
||||
var/key_len = length(copytext(input_file, 2 ,findtext(input_file, quote, 2)))
|
||||
//The key of the default tile model. (In SS13 this is: "/turf/space,/area")
|
||||
var/default_key
|
||||
|
||||
debug_file << " Building turf array."
|
||||
|
||||
//Iterates through the mapfile to build the model tiles for the map.
|
||||
for(var/line_position = 1; line_position < input_file_len; line_position = findtext(input_file,"\n", line_position) + 1)
|
||||
var/next_line = copytext(input_file, line_position, findtext(input_file,"\n", line_position) - 1)
|
||||
|
||||
//If the first character in the line is not a quote, the model tiles are all defined.
|
||||
if(copytext(next_line, 1, 2) != quote)
|
||||
break
|
||||
|
||||
//Copy contents of the model into the grid_models list.
|
||||
var/model_key = copytext(next_line, 2, findtext(input_file, quote, 2))
|
||||
var/model_contents = copytext(next_line, findtext(next_line, "=" ) + 3)
|
||||
if(!default_key && model_contents == "[world.turf],[world.area]")
|
||||
default_key = model_key
|
||||
grid_models[model_key] = model_contents
|
||||
if(prob(delay_chance))
|
||||
sleep(1)
|
||||
|
||||
//Co-ordinates of the tile being loaded.
|
||||
var/z_coordinate = -1
|
||||
var/y_coordinate = 0
|
||||
var/x_coordinate = 0
|
||||
|
||||
//Store the
|
||||
var/y_depth = 0
|
||||
|
||||
//Iterate through all z-levels to load the tiles.
|
||||
for(var/z_position = findtext(input_file, "\n(1,1,"); TRUE; z_position = findtext(input_file, "\n(1,1,", z_position + 1))
|
||||
//break when there are no more z-levels.
|
||||
if(z_position == 0)
|
||||
break
|
||||
|
||||
//Increment the z_coordinate and update the world's borders
|
||||
z_coordinate++
|
||||
world.maxz = max(world.maxz, z_coordinate + z_offset)
|
||||
|
||||
//Here we go!
|
||||
y_coordinate = 0
|
||||
y_depth = 0
|
||||
var/z_level = copytext(input_file, \
|
||||
findtext(input_file, quote + "\n", z_position) + 2,\
|
||||
findtext(input_file, "\n" + quote, z_position) + 1)
|
||||
|
||||
//Iterate through each line, increasing the y_coordinate.
|
||||
for(var/grid_position = 1; grid_position != 0; grid_position = findtext(z_level, "\n", grid_position) + 1)
|
||||
//Grab this line of data.
|
||||
var/grid_line = copytext(z_level, grid_position, findtext(z_level, "\n", grid_position))
|
||||
|
||||
//Compute the size of the z-levels y axis.
|
||||
if(!y_depth)
|
||||
y_depth = length(z_level) / (length(grid_line) + 1)
|
||||
y_depth += y_offset
|
||||
if(y_depth != round(y_depth, 1))
|
||||
debug_file << " Warning: y_depth is not a round number"
|
||||
|
||||
//And update the worlds variables.
|
||||
if(world.maxy < y_depth)
|
||||
world.maxy = y_depth
|
||||
//The top of the map is the highest "y" co-ordinate, so we start there and iterate downwards
|
||||
if(!y_coordinate)
|
||||
y_coordinate = y_depth + 1
|
||||
|
||||
//Decrement and load this line of the map.
|
||||
y_coordinate--
|
||||
x_coordinate = x_offset
|
||||
|
||||
//Iterate through the line loading the model tile data.
|
||||
for(var/model_position = 1; model_position <= length(grid_line); model_position += key_len)
|
||||
x_coordinate++
|
||||
|
||||
//Find the model key and load that model.
|
||||
var/model_key = copytext(grid_line, model_position, model_position + key_len)
|
||||
//If the key is the default one, skip it and save the computation time.
|
||||
if(model_key == default_key)
|
||||
continue
|
||||
|
||||
if(world.maxx < x_coordinate)
|
||||
world.maxx = x_coordinate
|
||||
parse_grid(grid_models[model_key], x_coordinate, y_coordinate, z_coordinate + z_offset)
|
||||
|
||||
if(prob(delay_chance))
|
||||
sleep(1)
|
||||
|
||||
//If we hit the last tile in this z-level, we should break out of the loop.
|
||||
if(grid_position + length(grid_line) + 1 > length(z_level))
|
||||
break
|
||||
|
||||
//Break out of the loop when we hit the end of the file.
|
||||
if(findtext(input_file, quote + "}", z_position) + 2 >= input_file_len)
|
||||
break
|
||||
|
||||
|
||||
proc/parse_grid(var/model as text, var/x_coordinate as num, var/y_coordinate as num, var/z_coordinate as num)
|
||||
//Accepts a text string containing a comma separated list of type paths of the
|
||||
// same construction as those contained in a .dmm file, and instantiates them.
|
||||
|
||||
var/list/text_strings = list()
|
||||
for(var/index = 1; findtext(model, quote); index++)
|
||||
/*Loop: Stores quoted portions of text in text_strings, and replaces them with an
|
||||
index to that list.
|
||||
- Each iteration represents one quoted section of text.
|
||||
*/
|
||||
//Add the next section of quoted text to the list
|
||||
var/first_quote = findtext(model, quote)
|
||||
var/second_quote = findtext(model, quote, first_quote + 1)
|
||||
var/quoted_chunk = copytext(model, first_quote + 1, second_quote)
|
||||
text_strings += quoted_chunk
|
||||
//Then remove the quoted section.
|
||||
model = copytext(model, 1, first_quote) + "~[index]" + copytext(model, second_quote + 1)
|
||||
|
||||
var/debug_output = 0
|
||||
//if(x_coordinate == 86 && y_coordinate == 88 && z_coordinate == 7)
|
||||
// debug_output = 1
|
||||
|
||||
if(debug_output)
|
||||
debug_file << " Now debugging turf: [model] ([x_coordinate], [y_coordinate], [z_coordinate])"
|
||||
|
||||
var/next_position = 1
|
||||
for(var/data_position = 1, next_position || data_position != 1, data_position = next_position + 1)
|
||||
next_position = findtext(model, ",/", data_position)
|
||||
|
||||
var/full_def = copytext(model, data_position, next_position)
|
||||
|
||||
if(debug_output)
|
||||
debug_file << " Current Line: [full_def] -- ([data_position] - [next_position])"
|
||||
|
||||
/*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields.
|
||||
- Each iteration represents one object's data, including type path and field values.
|
||||
*/
|
||||
|
||||
//Load the attribute data.
|
||||
var/attribute_position = findtext(full_def,"{")
|
||||
var/atom_def = text2path(copytext(full_def, 1, attribute_position))
|
||||
|
||||
var/list/attributes = list()
|
||||
if(attribute_position)
|
||||
full_def = copytext(full_def, attribute_position + 1)
|
||||
if(debug_output)
|
||||
debug_file << " Atom Def: [atom_def]"
|
||||
debug_file << " Parameters: [full_def]"
|
||||
|
||||
var/next_attribute = 1
|
||||
for(attribute_position = 1, next_attribute || attribute_position != 1, attribute_position = next_attribute + 1)
|
||||
next_attribute = findtext(full_def, ";", attribute_position)
|
||||
|
||||
//Loop: Identifies each attribute/value pair, and stores it in attributes[].
|
||||
attributes += copytext(full_def, attribute_position, next_attribute)
|
||||
|
||||
//Construct attributes associative list
|
||||
var/list/fields = list()
|
||||
for(var/attribute in attributes)
|
||||
var/trim_left = trim_text(copytext(attribute, 1, findtext(attribute, "=")))
|
||||
var/trim_right = trim_text(copytext(attribute, findtext(attribute, "=") + 1))
|
||||
|
||||
if(findtext(trim_right, "list("))
|
||||
trim_right = get_list(trim_right, text_strings)
|
||||
|
||||
else if(findtext(trim_right, "~"))//Check for strings
|
||||
while(findtext(trim_right,"~"))
|
||||
var/reference_index = copytext(trim_right, findtext(trim_right, "~") + 1)
|
||||
trim_right = text_strings[text2num(reference_index)]
|
||||
|
||||
//Check for numbers
|
||||
else if(isnum(text2num(trim_right)))
|
||||
trim_right = text2num(trim_right)
|
||||
|
||||
//Check for file
|
||||
else if(copytext(trim_right,1,2) == "'")
|
||||
trim_right = file(copytext(trim_right, 2, length(trim_right)))
|
||||
|
||||
fields[trim_left] = trim_right
|
||||
sleep(-1)
|
||||
|
||||
|
||||
if(debug_output)
|
||||
var/return_data = " Debug Fields:"
|
||||
for(var/item in fields)
|
||||
return_data += " [item] = [fields[item]];"
|
||||
debug_file << return_data
|
||||
|
||||
//Begin Instanciation
|
||||
var/atom/instance
|
||||
|
||||
if(ispath(atom_def,/area))
|
||||
instance = locate(atom_def)
|
||||
if(!istype(instance, atom_def))
|
||||
instance = new atom_def
|
||||
instance.contents.Add(locate(x_coordinate,y_coordinate,z_coordinate))
|
||||
|
||||
else
|
||||
instance = new atom_def(locate(x_coordinate,y_coordinate,z_coordinate))
|
||||
if(instance)
|
||||
for(var/item in fields)
|
||||
instance.vars[item] = fields[item]
|
||||
else if(!(atom_def in borked_paths))
|
||||
borked_paths += atom_def
|
||||
var/return_data = " Failure [atom_def] @ ([x_coordinate], [y_coordinate], [z_coordinate]) fields:"
|
||||
for(var/item in fields)
|
||||
return_data += " [item] = [fields[item]];"
|
||||
debug_file << return_data
|
||||
|
||||
sleep(-1)
|
||||
return 1
|
||||
|
||||
var/list/borked_paths = list()
|
||||
|
||||
proc/trim_text(var/what as text)
|
||||
while(length(what) && findtext(what, " ", 1, 2))
|
||||
what = copytext(what, 2)
|
||||
|
||||
while(length(what) && findtext(what, " ", length(what)))
|
||||
what = copytext(what, 1, length(what))
|
||||
|
||||
return what
|
||||
|
||||
proc/get_list(var/text, var/list/text_strings)
|
||||
//First, trim the data to just the list contents
|
||||
var/list_start = findtext(text, "(") + 1
|
||||
var/list_end = findtext(text, ")", list_start)
|
||||
var/list_contents = copytext(text, list_start, list_end)
|
||||
|
||||
//Then, we seperate it into the individual entries
|
||||
|
||||
var/list/entries = list()
|
||||
var/entry_end = 1
|
||||
|
||||
for(var/entry_start = 1, entry_end || entry_start != 1, entry_start = entry_end + 1)
|
||||
entry_end = findtext(list_contents, ",", entry_start)
|
||||
entries += copytext(list_contents, entry_start, entry_end)
|
||||
|
||||
//Finally, we assemble the completed list.
|
||||
var/list/final_list = list()
|
||||
for(var/entry in entries)
|
||||
var/equals_position = findtext(entry, "=")
|
||||
|
||||
if(equals_position)
|
||||
var/trim_left = trim_text(copytext(entry, 1, equals_position))
|
||||
var/trim_right = trim_text(copytext(entry, equals_position + 1))
|
||||
|
||||
if(findtext(trim_right, "list("))
|
||||
trim_right = get_list(trim_right, text_strings)
|
||||
|
||||
else if(findtext(trim_right, "~"))//Check for strings
|
||||
while(findtext(trim_right,"~"))
|
||||
var/reference_index = copytext(trim_right, findtext(trim_right, "~") + 1)
|
||||
trim_right = text_strings[text2num(reference_index)]
|
||||
|
||||
//Check for numbers
|
||||
else if(isnum(text2num(trim_right)))
|
||||
trim_right = text2num(trim_right)
|
||||
|
||||
//Check for file
|
||||
else if(copytext(trim_right,1,2) == "'")
|
||||
trim_right = file(copytext(trim_right, 2, length(trim_right)))
|
||||
|
||||
if(findtext(trim_left, "~"))//Check for strings
|
||||
while(findtext(trim_left,"~"))
|
||||
var/reference_index = copytext(trim_left, findtext(trim_left, "~") + 1)
|
||||
trim_left = text_strings[text2num(reference_index)]
|
||||
|
||||
final_list[trim_left] = trim_right
|
||||
|
||||
else
|
||||
if(findtext(entry, "~"))//Check for strings
|
||||
while(findtext(entry, "~"))
|
||||
var/reference_index = copytext(entry, findtext(entry, "~") + 1)
|
||||
entry = text_strings[text2num(reference_index)]
|
||||
|
||||
//Check for numbers
|
||||
else if(isnum(text2num(entry)))
|
||||
entry = text2num(entry)
|
||||
|
||||
//Check for file
|
||||
else if(copytext(entry, 1, 2) == "'")
|
||||
entry = file(copytext(entry, 2, length(entry)))
|
||||
|
||||
final_list += entry
|
||||
|
||||
return final_list
|
||||
@@ -311,7 +311,7 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
if (istype(W, /obj/item/device/measuring_tape))
|
||||
var/obj/item/device/measuring_tape/P = W
|
||||
user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].")
|
||||
if(do_after(user,40))
|
||||
if(do_after(user,25))
|
||||
user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm."
|
||||
return
|
||||
|
||||
|
||||
@@ -380,7 +380,7 @@
|
||||
u_equip(item)
|
||||
update_icons()
|
||||
|
||||
if (istype(usr, /mob/living/carbon/monkey)) //Check if a monkey is throwing. Modify/remove this line as required.
|
||||
if (istype(usr, /mob/living/carbon)) //Check if a carbon mob is throwing. Modify/remove this line as required.
|
||||
item.loc = src.loc
|
||||
if(src.client)
|
||||
src.client.screen -= item
|
||||
|
||||
@@ -381,7 +381,8 @@
|
||||
if(display_gloves)
|
||||
msg += "<span class='warning'><b>[src] has blood running from under [t_his] gloves!</b></span>\n"
|
||||
|
||||
|
||||
for(var/implant in get_visible_implants(1))
|
||||
msg += "<span class='warning'><b>[src] has \a [implant] sticking out of their flesh!</span>\n"
|
||||
if(digitalcamo)
|
||||
msg += "[t_He] [t_is] repulsively uncanny!\n"
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
if(istype(tmob, /mob/living/carbon/human))
|
||||
|
||||
for(var/mob/M in range(tmob, 1))
|
||||
if( ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
|
||||
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "\red [tmob] is restrained, you cannot push past"
|
||||
now_pushing = 0
|
||||
@@ -817,6 +817,8 @@
|
||||
return "Mobile vegetation"
|
||||
if("golem")
|
||||
return "Animated Construct"
|
||||
if("kidan")
|
||||
return "Kidan"
|
||||
else
|
||||
return "Human"
|
||||
|
||||
@@ -829,7 +831,9 @@
|
||||
else if(src.dna.mutantrace == "tajaran")
|
||||
return "Tajaran"
|
||||
else if(src.dna.mutantrace == "vox")
|
||||
return "vox"
|
||||
return "Vox"
|
||||
else if(src.dna.mutantrace == "kidan")
|
||||
return "Kidan"
|
||||
|
||||
/mob/living/carbon/proc/update_mutantrace_languages()
|
||||
if(src.dna)
|
||||
@@ -841,6 +845,8 @@
|
||||
src.tajaran_talk_understand = 1
|
||||
else if(src.dna.mutantrace == "vox")
|
||||
src.vox_talk_understand = 1
|
||||
else if(src.dna.mutantrace == "kidan")
|
||||
src.kidan_talk_understand = 1
|
||||
|
||||
/mob/living/carbon/human/proc/play_xylophone()
|
||||
if(!src.xylophone)
|
||||
@@ -1112,3 +1118,108 @@
|
||||
if(istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
|
||||
del(feet_blood_DNA)
|
||||
return 1
|
||||
|
||||
mob/living/carbon/human/yank_out_object()
|
||||
set category = "Object"
|
||||
set name = "Yank out object"
|
||||
set desc = "Remove an embedded item at the cost of bleeding and pain."
|
||||
set src in view(1)
|
||||
|
||||
if(!isliving(usr) || usr.next_move > world.time)
|
||||
return
|
||||
usr.next_move = world.time + 20
|
||||
|
||||
if(usr.stat == 1)
|
||||
usr << "You are unconcious and cannot do that!"
|
||||
return
|
||||
|
||||
if(usr.restrained())
|
||||
usr << "You are restrained and cannot do that!"
|
||||
return
|
||||
|
||||
var/list/valid_objects = list()
|
||||
var/datum/organ/external/affected = null
|
||||
var/mob/living/carbon/human/S = src
|
||||
var/mob/living/carbon/human/U = usr
|
||||
var/self = null
|
||||
|
||||
if(S == U)
|
||||
self = 1 // Removing object from yourself.
|
||||
|
||||
valid_objects = get_visible_implants(1)
|
||||
|
||||
if(!valid_objects.len)
|
||||
if(self)
|
||||
src << "You have nothing stuck in your wounds that is large enough to remove without surgery."
|
||||
else
|
||||
U << "[src] has nothing stuck in their wounds that is large enough to remove without surgery."
|
||||
return
|
||||
|
||||
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
|
||||
|
||||
for(var/datum/organ/external/organ in organs) //Grab the organ holding the implant.
|
||||
for(var/obj/item/weapon/O in organ.implants)
|
||||
if(O == selection)
|
||||
affected = organ
|
||||
if(self)
|
||||
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your [affected] with bloody fingers.</span>"
|
||||
else
|
||||
U << "<span class='warning'>You attempt to get a good grip on the [selection] in [S]'s [affected] with bloody fingers.</span>"
|
||||
|
||||
if(istype(U,/mob/living/carbon/human/)) U.bloody_hands(S)
|
||||
|
||||
if(!do_after(U, 80))
|
||||
return
|
||||
|
||||
if(!selection || !affected || !S || !U)
|
||||
return
|
||||
if(self)
|
||||
visible_message("<span class='warning'><b>[src] rips [selection] out of their [affected] in a welter of blood.</b></span>","<span class='warning'><b>You rip [selection] out of your [affected] in a welter of blood.</b></span>")
|
||||
else
|
||||
visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s [affected] in a welter of blood.</b></span>","<span class='warning'><b>[src] rips [selection] out of your [affected] in a welter of blood.</b></span>")
|
||||
|
||||
selection.loc = get_turf(src)
|
||||
affected.implants -= selection
|
||||
shock_stage+=10
|
||||
|
||||
for(var/obj/item/weapon/O in pinned)
|
||||
if(O == selection)
|
||||
pinned -= O
|
||||
if(!pinned.len)
|
||||
anchored = 0
|
||||
|
||||
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-.
|
||||
var/datum/wound/internal_bleeding/I = new (15)
|
||||
affected.wounds += I
|
||||
custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/get_visible_implants(var/class = 0)
|
||||
|
||||
var/list/visible_implants = list()
|
||||
for(var/datum/organ/external/organ in src.organs)
|
||||
for(var/obj/item/weapon/O in organ.implants)
|
||||
if(!istype(O,/obj/item/weapon/implant) && O.w_class > class)
|
||||
visible_implants += O
|
||||
|
||||
return(visible_implants)
|
||||
|
||||
/mob/living/carbon/human/proc/handle_embedded_objects()
|
||||
|
||||
for(var/datum/organ/external/organ in src.organs)
|
||||
for(var/obj/item/weapon/O in organ.implants)
|
||||
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
|
||||
// All kinds of embedded objects cause bleeding.
|
||||
var/msg = null
|
||||
switch(rand(1,3))
|
||||
if(1)
|
||||
msg ="<span class='warning'>A spike of pain jolts your [organ] as you bump [O] inside.</span>"
|
||||
if(2)
|
||||
msg ="<span class='warning'>Your movement jostles [O] in your [organ] painfully.</span>"
|
||||
if(3)
|
||||
msg ="<span class='warning'>[O] in your [organ] twists painfully as you move.</span>"
|
||||
src << msg
|
||||
|
||||
organ.status |= ORGAN_BLEEDING
|
||||
organ.take_damage(rand(1,3), 0, 0)
|
||||
src.adjustToxLoss(rand(1,3))
|
||||
@@ -190,7 +190,9 @@
|
||||
zone = "head"
|
||||
return organs_by_name[zone]
|
||||
|
||||
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null)
|
||||
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/obj/used_weapon = null)
|
||||
|
||||
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
|
||||
if((damagetype != BRUTE) && (damagetype != BURN))
|
||||
..(damage, damagetype, def_zone, blocked)
|
||||
return 1
|
||||
@@ -219,6 +221,29 @@
|
||||
UpdateDamageIcon()
|
||||
|
||||
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
|
||||
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
//Embedded projectile code.
|
||||
if(!organ) return
|
||||
if(istype(used_weapon,/obj/item/weapon))
|
||||
var/obj/item/weapon/W = used_weapon //Sharp objects will always embed if they do enough damage.
|
||||
if( (damage > (10*W.w_class)) && ( (sharp && !ismob(W.loc)) || prob(damage/W.w_class) ) )
|
||||
organ.implants += W
|
||||
visible_message("<span class='danger'>\The [W] sticks in the wound!</span>")
|
||||
W.add_blood(src)
|
||||
if(ismob(W.loc))
|
||||
var/mob/living/H = W.loc
|
||||
H.drop_item()
|
||||
W.loc = src
|
||||
|
||||
else if(istype(used_weapon,/obj/item/projectile)) //We don't want to use the actual projectile item, so we spawn some shrapnel.
|
||||
if(prob(75) && damagetype == BRUTE)
|
||||
var/obj/item/projectile/P = used_weapon
|
||||
var/obj/item/weapon/shard/shrapnel/S = new()
|
||||
S.name = "[P.name] shrapnel"
|
||||
S.desc = "[S.desc] It looks like it was fired from [P.shot_from]."
|
||||
S.loc = src
|
||||
organ.implants += S
|
||||
visible_message("<span class='danger'>The projectile sticks in the wound!</span>")
|
||||
S.add_blood(src)
|
||||
return 1
|
||||
@@ -161,6 +161,17 @@ emp_act
|
||||
if((user != src) && check_shields(I.force, "the [I.name]"))
|
||||
return 0
|
||||
|
||||
if(istype(I,/obj/item/weapon/card/emag))
|
||||
if(!(affecting.status & ORGAN_ROBOT))
|
||||
user << "\red That limb isn't robotic."
|
||||
return
|
||||
if(affecting.sabotaged)
|
||||
user << "\red [src]'s [affecting.display_name] is already sabotaged!"
|
||||
else
|
||||
user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.display_name] and short out the safeties."
|
||||
affecting.sabotaged = 1
|
||||
return
|
||||
|
||||
if(I.attack_verb.len)
|
||||
visible_message("\red <B>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</B>")
|
||||
else
|
||||
@@ -170,7 +181,7 @@ emp_act
|
||||
if(armor >= 2) return 0
|
||||
if(!I.force) return 0
|
||||
|
||||
apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), I.name)
|
||||
apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), I)
|
||||
|
||||
var/bloody = 0
|
||||
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
|
||||
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
|
||||
var/health_deficiency = (100 - health - halloss)
|
||||
if(health_deficiency >= 40) tally += (health_deficiency / 25)
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
update_inv_glasses()
|
||||
else if (W == head)
|
||||
head = null
|
||||
if(W.flags & BLOCKHAIR)
|
||||
if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR))
|
||||
update_hair(0) //rebuild hair
|
||||
success = 1
|
||||
update_inv_head()
|
||||
@@ -107,7 +107,7 @@
|
||||
else if (W == wear_mask)
|
||||
wear_mask = null
|
||||
success = 1
|
||||
if(W.flags & BLOCKHAIR)
|
||||
if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR))
|
||||
update_hair(0) //rebuild hair
|
||||
if(internal)
|
||||
if(internals)
|
||||
@@ -188,7 +188,7 @@
|
||||
update_inv_back(redraw_mob)
|
||||
if(slot_wear_mask)
|
||||
src.wear_mask = W
|
||||
if(wear_mask.flags & BLOCKHAIR)
|
||||
if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR))
|
||||
update_hair(redraw_mob) //rebuild hair
|
||||
W.equipped(src, slot)
|
||||
update_inv_wear_mask(redraw_mob)
|
||||
@@ -229,7 +229,7 @@
|
||||
update_inv_gloves(redraw_mob)
|
||||
if(slot_head)
|
||||
src.head = W
|
||||
if(head.flags & BLOCKHAIR)
|
||||
if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR))
|
||||
update_hair(redraw_mob) //rebuild hair
|
||||
if(istype(W,/obj/item/clothing/head/kitty))
|
||||
W.update_icon(src)
|
||||
|
||||
@@ -470,7 +470,7 @@
|
||||
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
|
||||
toxins_alert = max(toxins_alert, 1)
|
||||
else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox.
|
||||
var/ratio = (breath.oxygen/vox_oxygen_max) * 10
|
||||
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
|
||||
adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
|
||||
toxins_alert = max(toxins_alert, 1)
|
||||
else
|
||||
@@ -490,7 +490,7 @@
|
||||
|
||||
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
|
||||
if(status_flags & GODMODE) return 1 //godmode
|
||||
if(breath.temperature < 260.15)
|
||||
if(breath.temperature < 260.15 && dna.mutantrace != "vox") //Vox are resistant to cold.
|
||||
if(prob(20))
|
||||
src << "\red You feel your face freezing and an icicle forming in your lungs!"
|
||||
else if(breath.temperature > 360.15)
|
||||
@@ -501,10 +501,10 @@
|
||||
if(-INFINITY to 120)
|
||||
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
|
||||
fire_alert = max(fire_alert, 1)
|
||||
if(120 to 200)
|
||||
if(120 to 200 && dna.mutantrace != "vox") //Vox are resistant to cold.
|
||||
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
|
||||
fire_alert = max(fire_alert, 1)
|
||||
if(200 to 260)
|
||||
if(200 to 260 && dna.mutantrace != "vox") //Vox are resistant to cold.
|
||||
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
|
||||
fire_alert = max(fire_alert, 1)
|
||||
if(360 to 400)
|
||||
@@ -602,7 +602,7 @@
|
||||
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
|
||||
pressure_alert = -1
|
||||
else
|
||||
if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox")
|
||||
if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox") //Vox are resistant to pressure loss.
|
||||
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
|
||||
pressure_alert = -2
|
||||
else
|
||||
|
||||
@@ -350,7 +350,6 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
//masks and helmets can obscure our hair.
|
||||
if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
|
||||
if(update_icons) update_icons()
|
||||
|
||||
return
|
||||
|
||||
//base icons
|
||||
@@ -367,7 +366,7 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
face_standing.Blend(facial_s, ICON_OVERLAY)
|
||||
face_lying.Blend(facial_l, ICON_OVERLAY)
|
||||
|
||||
if(h_style)
|
||||
if(h_style && !(head && (head.flags & BLOCKHEADHAIR)))
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
|
||||
if(hair_style)
|
||||
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
@@ -444,10 +443,12 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
if("skrell")
|
||||
race_icon = 'icons/mob/human_races/r_skrell.dmi'
|
||||
deform_icon = 'icons/mob/human_races/r_def_skrell.dmi'
|
||||
|
||||
if("vox")
|
||||
race_icon = 'icons/mob/human_races/r_vox.dmi'
|
||||
deform_icon = 'icons/mob/human_races/r_def_vox.dmi'
|
||||
if("kidan")
|
||||
race_icon = 'icons/mob/human_races/r_kidan.dmi'
|
||||
deform_icon = 'icons/mob/human_races/r_def_kidan.dmi'
|
||||
|
||||
else
|
||||
race_icon = 'icons/mob/human_races/r_human.dmi'
|
||||
|
||||
@@ -438,21 +438,36 @@
|
||||
if(!reagents.has_reagent("inaprovaline"))
|
||||
adjustOxyLoss(1)
|
||||
Paralyse(3)
|
||||
if(halloss > 100)
|
||||
src << "<span class='notice'>You're in too much pain to keep going...</span>"
|
||||
for(var/mob/O in oviewers(src, null))
|
||||
O.show_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.", 1)
|
||||
Paralyse(10)
|
||||
setHalLoss(99)
|
||||
|
||||
if(paralysis)
|
||||
AdjustParalysis(-1)
|
||||
blinded = 1
|
||||
stat = UNCONSCIOUS
|
||||
if(halloss > 0)
|
||||
adjustHalLoss(-6)
|
||||
else if(sleeping)
|
||||
handle_dreams()
|
||||
adjustHalLoss(-6)
|
||||
sleeping = max(sleeping-1, 0)
|
||||
blinded = 1
|
||||
stat = UNCONSCIOUS
|
||||
if( prob(10) && health )
|
||||
if( prob(10) && health && !hal_crit )
|
||||
spawn(0)
|
||||
emote("snore")
|
||||
else if(resting)
|
||||
if(halloss > 0)
|
||||
adjustHalLoss(-6)
|
||||
//CONSCIOUS
|
||||
else
|
||||
stat = CONSCIOUS
|
||||
if(halloss > 0)
|
||||
adjustHalLoss(-2)
|
||||
|
||||
//Eyes
|
||||
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
|
||||
|
||||
@@ -3,13 +3,113 @@
|
||||
voice_name = "monkey"
|
||||
voice_message = "chimpers"
|
||||
say_message = "chimpers"
|
||||
icon = 'icons/mob/monkey.dmi'
|
||||
icon_state = "monkey1"
|
||||
icon = 'icons/mob/monkey.dmi'
|
||||
gender = NEUTER
|
||||
pass_flags = PASSTABLE
|
||||
update_icon = 0 ///no need to call regenerate_icon
|
||||
|
||||
var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie
|
||||
/mob/living/carbon/monkey/tajara
|
||||
name = "farwa"
|
||||
voice_name = "farwa"
|
||||
voice_message = "mews"
|
||||
say_message = "mews"
|
||||
icon_state = "tajkey1"
|
||||
|
||||
/mob/living/carbon/monkey/skrell
|
||||
name = "neaera"
|
||||
voice_name = "neaera"
|
||||
voice_message = "squicks"
|
||||
say_message = "squicks"
|
||||
icon_state = "skrellkey1"
|
||||
/mob/living/carbon/monkey/unathi
|
||||
name = "stok"
|
||||
voice_name = "stok"
|
||||
voice_message = "hisses"
|
||||
say_message = "hisses"
|
||||
icon_state = "stok1"
|
||||
|
||||
/mob/living/carbon/monkey/unathi/New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
|
||||
if(name == "stok")
|
||||
name = text("stok ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
if (!(dna))
|
||||
if(gender == NEUTER)
|
||||
gender = pick(MALE, FEMALE)
|
||||
dna = new /datum/dna( null )
|
||||
dna.real_name = real_name
|
||||
dna.uni_identity = "000000000000000000DC0000066000"
|
||||
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
|
||||
dna.unique_enzymes = md5(name)
|
||||
dna.mutantrace = "lizard"
|
||||
//////////blah
|
||||
var/gendervar
|
||||
if (gender == MALE)
|
||||
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
|
||||
else
|
||||
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
|
||||
dna.uni_identity += gendervar
|
||||
dna.uni_identity += "044"
|
||||
dna.uni_identity += "C5D"
|
||||
..()
|
||||
/mob/living/carbon/monkey/skrell/New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
if(name == "neaera")
|
||||
name = text("neaera ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
if (!(dna))
|
||||
if(gender == NEUTER)
|
||||
gender = pick(MALE, FEMALE)
|
||||
dna = new /datum/dna( null )
|
||||
dna.real_name = real_name
|
||||
dna.uni_identity = "000000000000000000DC0000066000"
|
||||
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
|
||||
dna.unique_enzymes = md5(name)
|
||||
dna.mutantrace = "skrell"
|
||||
//////////blah
|
||||
var/gendervar
|
||||
if (gender == MALE)
|
||||
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
|
||||
else
|
||||
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
|
||||
dna.uni_identity += gendervar
|
||||
dna.uni_identity += "01C"
|
||||
dna.uni_identity += "C92"
|
||||
..()
|
||||
/mob/living/carbon/monkey/tajara/New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
|
||||
if(name == "farwa")
|
||||
name = text("farwa ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
if (!(dna))
|
||||
if(gender == NEUTER)
|
||||
gender = pick(MALE, FEMALE)
|
||||
dna = new /datum/dna( null )
|
||||
dna.real_name = real_name
|
||||
dna.uni_identity = "000000000000000000DC0000066000"
|
||||
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
|
||||
dna.unique_enzymes = md5(name)
|
||||
dna.mutantrace = "tajaran"
|
||||
//////////blah
|
||||
var/gendervar
|
||||
if (gender == MALE)
|
||||
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
|
||||
else
|
||||
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
|
||||
dna.uni_identity += gendervar
|
||||
dna.uni_identity += "0A0"
|
||||
dna.uni_identity += "E00"
|
||||
..()
|
||||
|
||||
/mob/living/carbon/monkey/New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user