Merge branch 'master' of https://github.com/PolarisSS13/Polaris into NanoGrade

Conflicts:
	code/_helpers/time.dm
	code/modules/economy/ATM.dm
This commit is contained in:
SinTwo
2016-08-09 15:46:24 -04:00
209 changed files with 4110 additions and 3899 deletions

BIN
btime.dll

Binary file not shown.

BIN
btime.so

Binary file not shown.

View File

@@ -1,18 +0,0 @@
// Comment this out if the external btime library is unavailable
#define PRECISE_TIMER_AVAILABLE
#ifdef PRECISE_TIMER_AVAILABLE
var/global/__btime__libName = "btime.[world.system_type==MS_WINDOWS?"dll":"so"]"
#define TimeOfHour (__extern__timeofhour)
#define __extern__timeofhour text2num(call(__btime__libName, "gettime")())
/hook/startup/proc/checkbtime()
try
// This will always return 1 unless the btime library cannot be accessed
if(TimeOfHour || 1) return 1
catch(var/exception/e)
log_to_dd("PRECISE_TIMER_AVAILABLE is defined in btime.dm, but calling the btime library failed: [e]")
log_to_dd("This is a fatal error. The world will now shut down.")
del(world)
#else
#define TimeOfHour (world.timeofday % 36000)
#endif

View File

@@ -27,3 +27,6 @@
#define TICKS_IN_DAY 24*60*60*10 #define TICKS_IN_DAY 24*60*60*10
#define TICKS_IN_SECOND 10 #define TICKS_IN_SECOND 10
#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1)
#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0)

View File

@@ -11,10 +11,9 @@
#define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds #define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds
#define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds #define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds
#define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks #define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks
#define PROCESS_DEFAULT_SLEEP_INTERVAL 8 // 2 ticks #define PROCESS_DEFAULT_SLEEP_INTERVAL 8 // 1/8th of a tick
#define PROCESS_DEFAULT_CPU_THRESHOLD 90 // 90%
// SCHECK macros // SCHECK macros
// This references src directly to work around a weird bug with try/catch // This references src directly to work around a weird bug with try/catch
#define SCHECK_EVERY(this_many_calls) if(++src.calls_since_last_scheck >= this_many_calls) sleepCheck() #define SCHECK_EVERY(this_many_calls) if(++src.calls_since_last_scheck >= this_many_calls) sleepCheck()
#define SCHECK SCHECK_EVERY(50) #define SCHECK sleepCheck()

View File

@@ -0,0 +1,72 @@
#define ARCHAEO_BOWL 1
#define ARCHAEO_URN 2
#define ARCHAEO_CUTLERY 3
#define ARCHAEO_STATUETTE 4
#define ARCHAEO_INSTRUMENT 5
#define ARCHAEO_KNIFE 6
#define ARCHAEO_COIN 7
#define ARCHAEO_HANDCUFFS 8
#define ARCHAEO_BEARTRAP 9
#define ARCHAEO_LIGHTER 10
#define ARCHAEO_BOX 11
#define ARCHAEO_GASTANK 12
#define ARCHAEO_TOOL 13
#define ARCHAEO_METAL 14
#define ARCHAEO_PEN 15
#define ARCHAEO_CRYSTAL 16
#define ARCHAEO_CULTBLADE 17
#define ARCHAEO_TELEBEACON 18
#define ARCHAEO_CLAYMORE 19
#define ARCHAEO_CULTROBES 20
#define ARCHAEO_SOULSTONE 21
#define ARCHAEO_SHARD 22
#define ARCHAEO_RODS 23
#define ARCHAEO_STOCKPARTS 24
#define ARCHAEO_KATANA 25
#define ARCHAEO_LASER 26
#define ARCHAEO_GUN 27
#define ARCHAEO_UNKNOWN 28
#define ARCHAEO_FOSSIL 29
#define ARCHAEO_SHELL 30
#define ARCHAEO_PLANT 31
#define ARCHAEO_REMAINS_HUMANOID 32
#define ARCHAEO_REMAINS_ROBOT 33
#define ARCHAEO_REMAINS_XENO 34
#define ARCHAEO_GASMASK 35
#define MAX_ARCHAEO 35
#define DIGSITE_GARDEN 1
#define DIGSITE_ANIMAL 2
#define DIGSITE_HOUSE 3
#define DIGSITE_TECHNICAL 4
#define DIGSITE_TEMPLE 5
#define DIGSITE_WAR 6
#define EFFECT_TOUCH 0
#define EFFECT_AURA 1
#define EFFECT_PULSE 2
#define MAX_EFFECT 2
#define TRIGGER_TOUCH 0
#define TRIGGER_WATER 1
#define TRIGGER_ACID 2
#define TRIGGER_VOLATILE 3
#define TRIGGER_TOXIN 4
#define TRIGGER_FORCE 5
#define TRIGGER_ENERGY 6
#define TRIGGER_HEAT 7
#define TRIGGER_COLD 8
#define TRIGGER_PHORON 9
#define TRIGGER_OXY 10
#define TRIGGER_CO2 11
#define TRIGGER_NITRO 12
#define MAX_TRIGGER 12
#define EFFECT_UNKNOWN 0
#define EFFECT_ENERGY 1
#define EFFECT_PSIONIC 2
#define EFFECT_ELECTRO 3
#define EFFECT_PARTICLE 4
#define EFFECT_ORGANIC 5
#define EFFECT_BLUESPACE 6
#define EFFECT_SYNTH 7

View File

@@ -4,17 +4,56 @@
#define MINUTE *600 #define MINUTE *600
#define MINUTES *600 #define MINUTES *600
var/roundstart_hour = 0 #define HOUR *36000
//Returns the world time in english #define HOURS *36000
proc/worldtime2text(time = world.time, timeshift = 1)
if(!roundstart_hour) roundstart_hour = pick(2,7,12,17)
return timeshift ? time2text(time+(36000*roundstart_hour), "hh:mm") : time2text(time, "hh:mm")
proc/worlddate2text() #define DAY *864000
return num2text((text2num(time2text(world.timeofday, "YYYY"))+544)) + "-" + time2text(world.timeofday, "MM-DD") #define DAYS *864000
proc/time_stamp() #define TimeOfGame (get_game_time())
return time2text(world.timeofday, "hh:mm:ss") #define TimeOfTick (world.tick_usage*0.01*world.tick_lag)
/proc/get_game_time()
var/global/time_offset = 0
var/global/last_time = 0
var/global/last_usage = 0
var/wtime = world.time
var/wusage = world.tick_usage * 0.01
if(last_time < wtime && last_usage > 1)
time_offset += last_usage - 1
last_time = wtime
last_usage = wusage
return wtime + (time_offset + wusage) * world.tick_lag
var/roundstart_hour
var/station_date = ""
var/next_station_date_change = 1 DAY
#define duration2stationtime(time) time2text(station_time_in_ticks + time, "hh:mm")
#define worldtime2stationtime(time) time2text(roundstart_hour HOURS + time, "hh:mm")
#define round_duration_in_ticks (round_start_time ? world.time - round_start_time : 0)
#define station_time_in_ticks (roundstart_hour HOURS + round_duration_in_ticks)
/proc/stationtime2text()
return time2text(station_time_in_ticks, "hh:mm")
/proc/stationdate2text()
var/update_time = FALSE
if(station_time_in_ticks > next_station_date_change)
next_station_date_change += 1 DAY
update_time = TRUE
if(!station_date || update_time)
var/extra_days = round(station_time_in_ticks / (1 DAY)) DAYS
var/timeofday = world.timeofday + extra_days
station_date = num2text((text2num(time2text(timeofday, "YYYY"))+544)) + "-" + time2text(timeofday, "MM-DD")
return station_date
/proc/time_stamp()
return time2text(station_time_in_ticks, "hh:mm:ss")
/* Returns 1 if it is the selected month and day */ /* Returns 1 if it is the selected month and day */
proc/isDay(var/month, var/day) proc/isDay(var/month, var/day)
@@ -36,9 +75,7 @@ var/round_start_time = 0
round_start_time = world.time round_start_time = world.time
return 1 return 1
#define round_duration_in_ticks (round_start_time ? world.time - round_start_time : 0) /proc/roundduration2text()
/proc/round_duration_as_text()
if(!round_start_time) if(!round_start_time)
return "00:00" return "00:00"
if(last_round_duration && world.time < next_duration_update) if(last_round_duration && world.time < next_duration_update)
@@ -56,6 +93,14 @@ var/round_start_time = 0
next_duration_update = world.time + 1 MINUTES next_duration_update = world.time + 1 MINUTES
return last_round_duration return last_round_duration
//Can be useful for things dependent on process timing
/proc/process_schedule_interval(var/process_name)
var/datum/controller/process/process = processScheduler.getProcess(process_name)
return process.schedule_interval
/hook/startup/proc/set_roundstart_hour()
roundstart_hour = pick(2,7,12,17)
return 1
/* /*
Returns "watch handle" (really just a timestamp) Returns "watch handle" (really just a timestamp)
*/ */

View File

@@ -1,19 +0,0 @@
/**
* _stubs.dm
*
* This file contains constructs that the process scheduler expects to exist
* in a standard ss13 fork.
*/
/**
* logTheThing
*
* In goonstation, this proc writes a message to either the world log or diary.
*
* Blame Keelin.
*/
/proc/logTheThing(type, source, target, text, diaryType)
if(diaryType)
log_debug("Diary: \[[diaryType]:[type]] [text]")
else
log_debug("Log: \[[type]] [text]")

View File

@@ -69,10 +69,10 @@
* recordkeeping vars * recordkeeping vars
*/ */
// Records the time (1/10s timeofday) at which the process last finished sleeping // Records the time (1/10s timeoftick) at which the process last finished sleeping
var/tmp/last_slept = 0 var/tmp/last_slept = 0
// Records the time (1/10s timeofday) at which the process last began running // Records the time (1/10s timeofgame) at which the process last began running
var/tmp/run_start = 0 var/tmp/run_start = 0
// Records the number of times this process has been killed and restarted // Records the number of times this process has been killed and restarted
@@ -106,12 +106,8 @@
last_object = null last_object = null
/datum/controller/process/proc/started() /datum/controller/process/proc/started()
var/timeofhour = TimeOfHour
// Initialize last_slept so we can know when to sleep
last_slept = timeofhour
// Initialize run_start so we can detect hung processes. // Initialize run_start so we can detect hung processes.
run_start = timeofhour run_start = TimeOfGame
// Initialize defer count // Initialize defer count
cpu_defer_count = 0 cpu_defer_count = 0
@@ -163,18 +159,13 @@
setStatus(PROCESS_STATUS_HUNG) setStatus(PROCESS_STATUS_HUNG)
/datum/controller/process/proc/handleHung() /datum/controller/process/proc/handleHung()
var/timeofhour = TimeOfHour
var/datum/lastObj = last_object var/datum/lastObj = last_object
var/lastObjType = "null" var/lastObjType = "null"
if(istype(lastObj)) if(istype(lastObj))
lastObjType = lastObj.type lastObjType = lastObj.type
// If timeofhour has rolled over, then we need to adjust. var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(TimeOfGame - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]"
if (timeofhour < run_start) log_debug(msg)
run_start -= 36000
var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(timeofhour - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]"
logTheThing("debug", null, null, msg)
logTheThing("diary", null, null, msg, "debug")
message_admins(msg) message_admins(msg)
main.restartProcess(src.name) main.restartProcess(src.name)
@@ -182,8 +173,8 @@
/datum/controller/process/proc/kill() /datum/controller/process/proc/kill()
if (!killed) if (!killed)
var/msg = "[name] process was killed at tick #[ticks]." var/msg = "[name] process was killed at tick #[ticks]."
logTheThing("debug", null, null, msg) log_debug(msg)
logTheThing("diary", null, null, msg, "debug") message_admins(msg)
//finished() //finished()
// Allow inheritors to clean up if needed // Allow inheritors to clean up if needed
@@ -208,17 +199,12 @@
if (main.getCurrentTickElapsedTime() > main.timeAllowance) if (main.getCurrentTickElapsedTime() > main.timeAllowance)
sleep(world.tick_lag) sleep(world.tick_lag)
cpu_defer_count++ cpu_defer_count++
last_slept = TimeOfHour last_slept = 0
else else
var/timeofhour = TimeOfHour if (TimeOfTick > last_slept + sleep_interval)
// If timeofhour has rolled over, then we need to adjust.
if (timeofhour < last_slept)
last_slept -= 36000
if (timeofhour > last_slept + sleep_interval)
// If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed. // If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed.
sleep(0) sleep(0)
last_slept = TimeOfHour last_slept = TimeOfTick
/datum/controller/process/proc/update() /datum/controller/process/proc/update()
// Clear delta // Clear delta
@@ -239,10 +225,7 @@
/datum/controller/process/proc/getElapsedTime() /datum/controller/process/proc/getElapsedTime()
var/timeofhour = TimeOfHour return TimeOfGame - run_start
if (timeofhour < run_start)
return timeofhour - (run_start - 36000)
return timeofhour - run_start
/datum/controller/process/proc/tickDetail() /datum/controller/process/proc/tickDetail()
return return
@@ -343,6 +326,11 @@
stat("[name]", "T#[getTicks()] | AR [averageRunTime] | LR [lastRunTime] | HR [highestRunTime] | D [cpu_defer_count]") stat("[name]", "T#[getTicks()] | AR [averageRunTime] | LR [lastRunTime] | HR [highestRunTime] | D [cpu_defer_count]")
/datum/controller/process/proc/catchException(var/exception/e, var/thrower) /datum/controller/process/proc/catchException(var/exception/e, var/thrower)
if(istype(e)) // Real runtimes go to the real error handler
// There are two newlines here, because handling desc sucks
e.desc = " Caught by process: [name]\n\n" + e.desc
world.Error(e, e_src = thrower)
return
var/etext = "[e]" var/etext = "[e]"
var/eid = "[e]" // Exception ID, for tracking repeated exceptions var/eid = "[e]" // Exception ID, for tracking repeated exceptions
var/ptext = "" // "processing..." text, for what was being processed (if known) var/ptext = "" // "processing..." text, for what was being processed (if known)

View File

@@ -43,8 +43,6 @@ var/global/datum/controller/processScheduler/processScheduler
var/tmp/currentTick = 0 var/tmp/currentTick = 0
var/tmp/currentTickStart = 0
var/tmp/timeAllowance = 0 var/tmp/timeAllowance = 0
var/tmp/cpuAverage = 0 var/tmp/cpuAverage = 0
@@ -247,7 +245,7 @@ var/global/datum/controller/processScheduler/processScheduler
/datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null) /datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null)
if (isnull(time)) if (isnull(time))
time = TimeOfHour time = TimeOfGame
last_queued[process] = world.time last_queued[process] = world.time
last_start[process] = time last_start[process] = time
else else
@@ -256,11 +254,7 @@ var/global/datum/controller/processScheduler/processScheduler
/datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null) /datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null)
if (isnull(time)) if (isnull(time))
time = TimeOfHour time = TimeOfGame
// If world.timeofday has rolled over, then we need to adjust.
if (time < last_start[process])
last_start[process] -= 36000
var/lastRunTime = time - last_start[process] var/lastRunTime = time - last_start[process]
@@ -349,29 +343,23 @@ var/global/datum/controller/processScheduler/processScheduler
updateCurrentTickData() updateCurrentTickData()
return 0 return 0
else else
return TimeOfHour - currentTickStart return TimeOfTick
/datum/controller/processScheduler/proc/updateCurrentTickData() /datum/controller/processScheduler/proc/updateCurrentTickData()
if (world.time > currentTick) if (world.time > currentTick)
// New tick! // New tick!
currentTick = world.time currentTick = world.time
currentTickStart = TimeOfHour
updateTimeAllowance() updateTimeAllowance()
cpuAverage = (world.cpu + cpuAverage + cpuAverage) / 3 cpuAverage = (world.cpu + cpuAverage + cpuAverage) / 3
/datum/controller/processScheduler/proc/updateTimeAllowance() /datum/controller/processScheduler/proc/updateTimeAllowance()
// Time allowance goes down linearly with world.cpu. // Time allowance goes down linearly with world.cpu.
var/tmp/error = cpuAverage - 100 var/tmp/error = cpuAverage - 100
var/tmp/timeAllowanceDelta = sign(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error)) var/tmp/timeAllowanceDelta = SIMPLE_SIGN(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error))
//timeAllowance = world.tick_lag * min(1, 0.5 * ((200/max(1,cpuAverage)) - 1)) //timeAllowance = world.tick_lag * min(1, 0.5 * ((200/max(1,cpuAverage)) - 1))
timeAllowance = min(timeAllowanceMax, max(0, timeAllowance + timeAllowanceDelta)) timeAllowance = min(timeAllowanceMax, max(0, timeAllowance + timeAllowanceDelta))
/datum/controller/processScheduler/proc/sign(var/x)
if (x == 0)
return 1
return x / abs(x)
/datum/controller/processScheduler/proc/statProcesses() /datum/controller/processScheduler/proc/statProcesses()
if(!isRunning) if(!isRunning)
stat("Processes", "Scheduler not running") stat("Processes", "Scheduler not running")
@@ -380,3 +368,6 @@ var/global/datum/controller/processScheduler/processScheduler
stat(null, "[round(cpuAverage, 0.1)] CPU, [round(timeAllowance, 0.1)/10] TA") stat(null, "[round(cpuAverage, 0.1)] CPU, [round(timeAllowance, 0.1)/10] TA")
for(var/datum/controller/process/p in processes) for(var/datum/controller/process/p in processes)
p.statProcess() p.statProcess()
/datum/controller/processScheduler/proc/getProcess(var/process_name)
return nameToProcessMap[process_name]

View File

@@ -1,56 +0,0 @@
(function ($) {
function setRef(theRef) {
ref = theRef;
}
function jax(action, data) {
if (typeof data === 'undefined')
data = {};
var params = [];
for (var k in data) {
if (data.hasOwnProperty(k)) {
params.push(encodeURIComponent(k) + '=' + encodeURIComponent(data[k]));
}
}
var newLoc = '?src=' + ref + ';action=' + action + ';' + params.join(';');
window.location = newLoc;
}
function requestRefresh(e) {
jax("refresh", null);
}
function handleRefresh(processTable) {
$('#processTable').html(processTable);
initProcessTableButtons();
}
function requestKill(e) {
var button = $(e.currentTarget);
jax("kill", {name: button.data("process-name")});
}
function requestEnable(e) {
var button = $(e.currentTarget);
jax("enable", {name: button.data("process-name")});
}
function requestDisable(e) {
var button = $(e.currentTarget);
jax("disable", {name: button.data("process-name")});
}
function initProcessTableButtons() {
$(".kill-btn").on("click", requestKill);
$(".enable-btn").on("click", requestEnable);
$(".disable-btn").on("click", requestDisable);
}
window.setRef = setRef;
window.handleRefresh = handleRefresh;
$(function() {
initProcessTableButtons();
$('#btn-refresh').on("click", requestRefresh);
});
}(jQuery));

View File

@@ -120,7 +120,7 @@ var/global/list/round_voters = list() // Keeps track of the individuals voting f
if(choices[current_votes[key]] == .) if(choices[current_votes[key]] == .)
round_voters += key // Keep track of who voted for the winning round. round_voters += key // Keep track of who voted for the winning round.
if(mode != VOTE_GAMEMODE || . == "Extended" || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes if(mode != VOTE_GAMEMODE || . == "Extended" || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes
text += "<b>Vote Result: [.]</b>" text += "<b>Vote Result: [mode == VOTE_GAMEMODE ? gamemode_names[.] : .]</b>"
else else
text += "<b>The vote has ended.</b>" text += "<b>The vote has ended.</b>"

View File

@@ -25,11 +25,12 @@
/datum/uplink_item/item/ammo/tommydrum /datum/uplink_item/item/ammo/tommydrum
name = "Tommygun Drum Magazine (.45)" name = "Tommygun Drum Magazine (.45)"
path = /obj/item/ammo_magazine/tommydrum path = /obj/item/ammo_magazine/tommydrum
item_cost = 4 // Buy 40 bullets, get 10 free! item_cost = 40 // Buy 40 bullets, get 10 free!
/datum/uplink_item/item/ammo/darts /datum/uplink_item/item/ammo/darts
name = "Darts" name = "Darts"
path = /obj/item/ammo_magazine/chemdart path = /obj/item/ammo_magazine/chemdart
item_cost = 5
/datum/uplink_item/item/ammo/sniperammo /datum/uplink_item/item/ammo/sniperammo
name = "Anti-Materiel Rifle ammo box (14.5mm)" name = "Anti-Materiel Rifle ammo box (14.5mm)"
@@ -98,7 +99,9 @@
/datum/uplink_item/item/ammo/g12/stun /datum/uplink_item/item/ammo/g12/stun
name = "12g Auto-Shotgun Magazine (Stun)" name = "12g Auto-Shotgun Magazine (Stun)"
path = /obj/item/weapon/storage/box/stunshells path = /obj/item/weapon/storage/box/stunshells
item_cost = 10 // Discount due to it being LTL.
/datum/uplink_item/item/ammo/g12/flash /datum/uplink_item/item/ammo/g12/flash
name = "12g Auto-Shotgun Magazine (Flash)" name = "12g Auto-Shotgun Magazine (Flash)"
path = /obj/item/weapon/storage/box/flashshells path = /obj/item/weapon/storage/box/flashshells
item_cost = 10 // Discount due to it being LTL.

View File

@@ -61,17 +61,17 @@
/datum/uplink_item/item/badassery/surplus/merc2 /datum/uplink_item/item/badassery/surplus/merc2
name = "Surplus Crate - 240 TC" name = "Surplus Crate - 240 TC"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 2 item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 2
item_worth = 360 item_worth = 540
/datum/uplink_item/item/badassery/surplus/merc4 /datum/uplink_item/item/badassery/surplus/merc4
name = "Surplus Crate - 480 TC" name = "Surplus Crate - 480 TC"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4 item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4
item_worth = 720 item_worth = 1200
/datum/uplink_item/item/badassery/surplus/merc6 /datum/uplink_item/item/badassery/surplus/merc6
name = "Surplus Crate - 720 TC" name = "Surplus Crate - 720 TC"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 6 item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 6
item_worth = 1440 item_worth = 1980
/datum/uplink_item/item/badassery/surplus/New() /datum/uplink_item/item/badassery/surplus/New()
..() ..()

View File

@@ -31,10 +31,10 @@
/datum/uplink_item/item/stealth_items/voice /datum/uplink_item/item/stealth_items/voice
name = "Voice Changer" name = "Voice Changer"
item_cost = 30 item_cost = 15
path = /obj/item/clothing/mask/gas/voice path = /obj/item/clothing/mask/gas/voice
/datum/uplink_item/item/stealth_items/camera_floppy /datum/uplink_item/item/stealth_items/camera_floppy
name = "Camera Network Access - Floppy" name = "Camera Network Access - Floppy"
item_cost = 30 item_cost = 15
path = /obj/item/weapon/disk/file/cameras/syndicate path = /obj/item/weapon/disk/file/cameras/syndicate

View File

@@ -26,10 +26,10 @@
/datum/uplink_item/item/stealthy_weapons/cigarette_kit /datum/uplink_item/item/stealthy_weapons/cigarette_kit
name = "Cigarette Kit" name = "Cigarette Kit"
item_cost = 15 item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/cigarette path = /obj/item/weapon/storage/box/syndie_kit/cigarette
/datum/uplink_item/item/stealthy_weapons/random_toxin /datum/uplink_item/item/stealthy_weapons/random_toxin
name = "Random Toxin - Beaker" name = "Random Toxin - Beaker"
item_cost = 15 item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/toxin path = /obj/item/weapon/storage/box/syndie_kit/toxin

View File

@@ -14,16 +14,55 @@
item_cost = 10 item_cost = 10
path = /obj/item/weapon/storage/toolbox/syndicate path = /obj/item/weapon/storage/toolbox/syndicate
/datum/uplink_item/item/tools/plastique /datum/uplink_item/item/tools/clerical
name = "C-4 (Destroys walls)" name = "Morphic Clerical Kit"
item_cost = 20 item_cost = 10
path = /obj/item/weapon/plastique path = /obj/item/weapon/storage/box/syndie_kit/clerical
/datum/uplink_item/item/tools/encryptionkey_radio /datum/uplink_item/item/tools/encryptionkey_radio
name = "Encrypted Radio Channel Key" name = "Encrypted Radio Channel Key"
item_cost = 20 item_cost = 10
path = /obj/item/device/encryptionkey/syndicate path = /obj/item/device/encryptionkey/syndicate
/datum/uplink_item/item/tools/money
name = "Operations Funding"
item_cost = 10
path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
/datum/uplink_item/item/tools/plastique
name = "C-4 (Destroys walls)"
item_cost = 10
path = /obj/item/weapon/plastique
/datum/uplink_item/item/tools/duffle
name = "Black Duffle Bag"
item_cost = 10
path = /obj/item/weapon/storage/backpack/dufflebag/syndie
/datum/uplink_item/item/tools/duffle/med
name = "Black Medical Duffle Bag"
path = /obj/item/weapon/storage/backpack/dufflebag/syndie/med
/datum/uplink_item/item/tools/duffle/ammo
name = "Black Ammunition Duffle Bag"
path = /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo
/datum/uplink_item/item/tools/space_suit
name = "Space Suit"
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/space
/datum/uplink_item/item/tools/encryptionkey_binary
name = "Binary Translator Key"
item_cost = 15
path = /obj/item/device/encryptionkey/binary
/datum/uplink_item/item/tools/packagebomb
name = "Package Bomb (Small)"
item_cost = 20
path = /obj/item/weapon/storage/box/syndie_kit/demolitions
/datum/uplink_item/item/tools/hacking_tool /datum/uplink_item/item/tools/hacking_tool
name = "Door Hacking Tool" name = "Door Hacking Tool"
item_cost = 20 item_cost = 20
@@ -32,32 +71,11 @@
When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
This device will also be able to immediately access the last 6 to 8 hacked airlocks." This device will also be able to immediately access the last 6 to 8 hacked airlocks."
/datum/uplink_item/item/tools/encryptionkey_binary
name = "Binary Translator Key"
item_cost = 20
path = /obj/item/device/encryptionkey/binary
/datum/uplink_item/item/tools/emag /datum/uplink_item/item/tools/emag
name = "Cryptographic Sequencer" name = "Cryptographic Sequencer"
item_cost = 30 item_cost = 30
path = /obj/item/weapon/card/emag path = /obj/item/weapon/card/emag
/datum/uplink_item/item/tools/clerical
name = "Morphic Clerical Kit"
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/clerical
/datum/uplink_item/item/tools/money
name = "Operations Funding"
item_cost = 15
path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
/datum/uplink_item/item/tools/space_suit
name = "Space Suit"
item_cost = 15
path = /obj/item/weapon/storage/box/syndie_kit/space
/datum/uplink_item/item/tools/thermal /datum/uplink_item/item/tools/thermal
name = "Thermal Imaging Glasses" name = "Thermal Imaging Glasses"
item_cost = 30 item_cost = 30
@@ -65,9 +83,21 @@
/datum/uplink_item/item/tools/powersink /datum/uplink_item/item/tools/powersink
name = "Powersink (DANGER!)" name = "Powersink (DANGER!)"
item_cost = 50 item_cost = 40
path = /obj/item/device/powersink path = /obj/item/device/powersink
/datum/uplink_item/item/tools/packagebomb/large
name = "Package Bomb (Large)"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/demolitions_heavy
/*
/datum/uplink_item/item/tools/packagebomb/huge
name = "Package Bomb (Huge)
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy
*/
/datum/uplink_item/item/tools/ai_module /datum/uplink_item/item/tools/ai_module
name = "Hacked AI Upload Module" name = "Hacked AI Upload Module"
item_cost = 60 item_cost = 60

View File

@@ -11,7 +11,7 @@
/datum/uplink_item/item/visible_weapons/combatknife /datum/uplink_item/item/visible_weapons/combatknife
name = "Combat Knife" name = "Combat Knife"
item_cost = 30 item_cost = 20
path = /obj/item/weapon/material/hatchet/tacknife/combatknife path = /obj/item/weapon/material/hatchet/tacknife/combatknife
/datum/uplink_item/item/visible_weapons/energy_sword /datum/uplink_item/item/visible_weapons/energy_sword

View File

@@ -41,7 +41,9 @@ var/datum/antagonist/technomancer/technomancers
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/disposable_teleporter/free(technomancer_mob), slot_r_store) technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/disposable_teleporter/free(technomancer_mob), slot_r_store)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/technomancer_catalog(technomancer_mob), slot_l_store) technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/technomancer_catalog(technomancer_mob), slot_l_store)
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(technomancer_mob), slot_l_ear) technomancer_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(technomancer_mob), slot_l_ear)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/technomancer_core(technomancer_mob), slot_back) var/obj/item/weapon/technomancer_core/core = new /obj/item/weapon/technomancer_core(technomancer_mob)
technomancer_mob.equip_to_slot_or_del(core, slot_back)
technomancer_belongings.Add(core) // So it can be Tracked.
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/flashlight(technomancer_mob), slot_belt) technomancer_mob.equip_to_slot_or_del(new /obj/item/device/flashlight(technomancer_mob), slot_belt)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(technomancer_mob), slot_shoes) technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(technomancer_mob), slot_shoes)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/head/technomancer/master(technomancer_mob), slot_head) technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/head/technomancer/master(technomancer_mob), slot_head)
@@ -59,7 +61,9 @@ var/datum/antagonist/technomancer/technomancers
technomancer_mob.equip_to_slot_or_del(catalog, slot_l_store) technomancer_mob.equip_to_slot_or_del(catalog, slot_l_store)
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(technomancer_mob), slot_l_ear) technomancer_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(technomancer_mob), slot_l_ear)
technomancer_mob.equip_to_slot_or_del(new /obj/item/weapon/technomancer_core(technomancer_mob), slot_back) var/obj/item/weapon/technomancer_core/core = new /obj/item/weapon/technomancer_core(technomancer_mob)
technomancer_mob.equip_to_slot_or_del(core, slot_back)
technomancer_belongings.Add(core) // So it can be Tracked.
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/flashlight(technomancer_mob), slot_belt) technomancer_mob.equip_to_slot_or_del(new /obj/item/device/flashlight(technomancer_mob), slot_belt)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(technomancer_mob), slot_shoes) technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(technomancer_mob), slot_shoes)
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/head/technomancer/apprentice(technomancer_mob), slot_head) technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/head/technomancer/apprentice(technomancer_mob), slot_head)

View File

@@ -2,7 +2,7 @@
name = "Organic Space Suit" name = "Organic Space Suit"
desc = "We grow an organic suit to protect ourselves from space exposure." desc = "We grow an organic suit to protect ourselves from space exposure."
helptext = "To remove the suit, use the ability again." helptext = "To remove the suit, use the ability again."
ability_icon_state = "ling_space_suit" ability_icon_state = "lingspacesuit"
genomecost = 1 genomecost = 1
verbpath = /mob/proc/changeling_spacesuit verbpath = /mob/proc/changeling_spacesuit
@@ -17,7 +17,7 @@
name = "Chitinous Spacearmor" name = "Chitinous Spacearmor"
desc = "We turn our skin into tough chitin to protect us from damage and space exposure." desc = "We turn our skin into tough chitin to protect us from damage and space exposure."
helptext = "To remove the armor, use the ability again." helptext = "To remove the armor, use the ability again."
ability_icon_state = "ling_armor" ability_icon_state = "lingarmor"
genomecost = 3 genomecost = 3
verbpath = /mob/proc/changeling_spacearmor verbpath = /mob/proc/changeling_spacearmor
@@ -34,7 +34,6 @@
/obj/item/clothing/suit/space/changeling /obj/item/clothing/suit/space/changeling
name = "flesh mass" name = "flesh mass"
icon_state = "lingspacesuit" icon_state = "lingspacesuit"
item_state = "lingspacehelmet"
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
flags = STOPPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, flags = STOPPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it,
//it still ends up in your blood. (also balance but muh fluff) //it still ends up in your blood. (also balance but muh fluff)
@@ -55,7 +54,6 @@
/obj/item/clothing/head/helmet/space/changeling /obj/item/clothing/head/helmet/space/changeling
name = "flesh mass" name = "flesh mass"
icon_state = "lingspacehelmet" icon_state = "lingspacehelmet"
item_state = "lingspacehelmet"
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
flags = BLOCKHAIR | STOPPRESSUREDAMAGE //Again, no THICKMATERIAL. flags = BLOCKHAIR | STOPPRESSUREDAMAGE //Again, no THICKMATERIAL.
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)

View File

@@ -37,6 +37,7 @@
for(var/limb in H.organs_by_name) for(var/limb in H.organs_by_name)
var/obj/item/organ/external/current_limb = H.organs_by_name[limb] var/obj/item/organ/external/current_limb = H.organs_by_name[limb]
current_limb.undislocate() current_limb.undislocate()
current_limb.open = 0
C.halloss = 0 C.halloss = 0
C.shock_stage = 0 //Pain C.shock_stage = 0 //Pain

View File

@@ -2,15 +2,30 @@
name = "Self Respiration" name = "Self Respiration"
desc = "We evolve our body to no longer require drawing oxygen from the atmosphere." desc = "We evolve our body to no longer require drawing oxygen from the atmosphere."
helptext = "We will no longer require internals, and we cannot inhale any gas, including harmful ones." helptext = "We will no longer require internals, and we cannot inhale any gas, including harmful ones."
ability_icon_state = "ling_toggle_breath"
genomecost = 0 genomecost = 0
isVerb = 0
verbpath = /mob/proc/changeling_self_respiration verbpath = /mob/proc/changeling_self_respiration
//No breathing required //No breathing required
/mob/proc/changeling_self_respiration() /mob/proc/changeling_self_respiration()
set category = "Changeling"
set name = "Toggle Breathing"
set desc = "We choose whether or not to breathe."
var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS)
if(!changeling)
return 0
if(istype(src,/mob/living/carbon)) if(istype(src,/mob/living/carbon))
var/mob/living/carbon/C = src var/mob/living/carbon/C = src
if(C.suiciding)
src << "You're committing suicide, this isn't going to work."
return 0
if(C.does_not_breathe == 0)
C.does_not_breathe = 1 C.does_not_breathe = 1
src << "<span class='notice'>We stop breathing, as we no longer need to.</span>" src << "<span class='notice'>We stop breathing, as we no longer need to.</span>"
return 1 return 1
else
C.does_not_breathe = 0
src << "<span class='notice'>We resume breathing, as we now need to again.</span>"
return 0 return 0

View File

@@ -247,7 +247,8 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
if(desired_object.cost <= budget) if(desired_object.cost <= budget)
budget -= desired_object.cost budget -= desired_object.cost
H << "<span class='notice'>You have just bought \a [desired_object.name].</span>" H << "<span class='notice'>You have just bought \a [desired_object.name].</span>"
new desired_object.obj_path(get_turf(H)) var/obj/O = new desired_object.obj_path(get_turf(H))
technomancer_belongings.Add(O) // Used for the Track spell.
else //Can't afford. else //Can't afford.
H << "<span class='danger'>You can't afford that!</span>" H << "<span class='danger'>You can't afford that!</span>"

View File

@@ -83,6 +83,9 @@
energy_delta = energy - old_energy energy_delta = energy - old_energy
if(world.time % 5 == 0) // Maintaining fat lists is expensive, I imagine. if(world.time % 5 == 0) // Maintaining fat lists is expensive, I imagine.
maintain_summon_list() maintain_summon_list()
if(wearer && wearer.mind)
if(!(technomancers.is_antagonist(wearer.mind))) // In case someone tries to wear a stolen core.
wearer.adjust_instability(20)
/obj/item/weapon/technomancer_core/proc/regenerate() /obj/item/weapon/technomancer_core/proc/regenerate()
energy = min(max(energy + regen_rate, 0), max_energy) energy = min(max(energy + regen_rate, 0), max_energy)

View File

@@ -0,0 +1,11 @@
/datum/technomancer/consumable/freedom_implant
name = "Freedom Implant"
desc = "A hidden implant which allows one to escape bindings such as handcuffs."
cost = 50
obj_path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom
/datum/technomancer/consumable/explosive_implant
name = "Explosive Implant"
desc = "A hidden implant which will explode if it hears a passphrase."
cost = 150
obj_path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive

View File

@@ -82,8 +82,7 @@
/obj/item/weapon/storage/belt/holding /obj/item/weapon/storage/belt/holding
name = "Belt of Holding" name = "Belt of Holding"
desc = "Can hold more than you'd expect." desc = "Can hold more than you'd expect."
icon_state = "emsbelt" icon_state = "ems"
item_state = "emsbelt"
max_w_class = 3 // Can hold normal sized items. max_w_class = 3 // Can hold normal sized items.
storage_slots = 14 // Twice the capacity of a typical belt. storage_slots = 14 // Twice the capacity of a typical belt.
max_storage_space = 42 max_storage_space = 42

View File

@@ -205,6 +205,11 @@
var/radius = max(get_dist(H, src), 1) var/radius = max(get_dist(H, src), 1)
// People next to the source take a third of the instability. Further distance decreases the amount absorbed. // People next to the source take a third of the instability. Further distance decreases the amount absorbed.
var/outgoing_instability = (instability / 3) * ( 1 / (radius**2) ) var/outgoing_instability = (instability / 3) * ( 1 / (radius**2) )
// Energy armor like from the AMI RIG can protect from this.
var/armor = getarmor(null, "energy")
var/armor_factor = abs( (armor - 100) / 100)
outgoing_instability = outgoing_instability * armor_factor
H.adjust_instability(outgoing_instability) H.adjust_instability(outgoing_instability)
set_light(distance, distance, l_color = "#C26DDE") set_light(distance, distance, l_color = "#C26DDE")

View File

@@ -13,7 +13,7 @@
icon_state = "generic" icon_state = "generic"
cast_methods = null cast_methods = null
aspect = ASPECT_FROST aspect = ASPECT_FROST
glow_color = "#FF6A00" glow_color = "#00B3FF"
/obj/item/weapon/spell/aura/frost/process() /obj/item/weapon/spell/aura/frost/process()
if(!pay_energy(100)) if(!pay_energy(100))

View File

@@ -15,7 +15,7 @@
glow_color = "#0000FF" //TODO glow_color = "#0000FF" //TODO
/obj/item/weapon/spell/aura/unstable/process() /obj/item/weapon/spell/aura/unstable/process()
if(!pay_energy(500)) if(!pay_energy(200))
qdel(src) qdel(src)
var/list/nearby_mobs = range(14,owner) var/list/nearby_mobs = range(14,owner)
for(var/mob/living/L in nearby_mobs) for(var/mob/living/L in nearby_mobs)
@@ -25,6 +25,7 @@
var/damage_to_inflict = max(L.health / L.maxHealth, 0) // Otherwise, those in crit would actually be healed. var/damage_to_inflict = max(L.health / L.maxHealth, 0) // Otherwise, those in crit would actually be healed.
var/armor_factor = abs(L.getarmor(null, "energy") - 100) var/armor_factor = abs(L.getarmor(null, "energy") - 100)
armor_factor = armor_factor / 100
damage_to_inflict = damage_to_inflict * armor_factor damage_to_inflict = damage_to_inflict * armor_factor

View File

@@ -6,11 +6,13 @@
obj_path = /obj/item/weapon/spell/gambit obj_path = /obj/item/weapon/spell/gambit
/var/global/list/all_technomancer_gambit_spells = typesof(/obj/item/weapon/spell) - list( /var/global/list/all_technomancer_gambit_spells = typesof(/obj/item/weapon/spell) - list(
/obj/item/weapon/spell,
/obj/item/weapon/spell/gambit, /obj/item/weapon/spell/gambit,
/obj/item/weapon/spell/projectile, /obj/item/weapon/spell/projectile,
/obj/item/weapon/spell/aura, /obj/item/weapon/spell/aura,
/obj/item/weapon/spell/insert, /obj/item/weapon/spell/insert,
/obj/item/weapon/spell/spawner) /obj/item/weapon/spell/spawner,
/obj/item/weapon/spell/summon)
/obj/item/weapon/spell/gambit /obj/item/weapon/spell/gambit
name = "gambit" name = "gambit"

View File

@@ -46,10 +46,19 @@
/obj/item/weapon/spell/illusion/on_use_cast(mob/user) /obj/item/weapon/spell/illusion/on_use_cast(mob/user)
if(illusion) if(illusion)
var/choice = alert(user, "Would you like to have \the [illusion] speak, or do an emote?", "Illusion", "Speak","Emote","Cancel")
switch(choice)
if("Cancel")
return
if("Speak")
var/what_to_say = input(user, "What do you want \the [illusion] to say?","Illusion Speak") as null|text var/what_to_say = input(user, "What do you want \the [illusion] to say?","Illusion Speak") as null|text
what_to_say = sanitize(what_to_say) //what_to_say = sanitize(what_to_say) //Sanitize occurs inside say() already.
if(what_to_say) if(what_to_say)
illusion.say(what_to_say) illusion.say(what_to_say)
if("Emote")
var/what_to_emote = input(user, "What do you want \the [illusion] to do?","Illusion Emote") as null|text
if(what_to_emote)
illusion.emote(what_to_emote)
/obj/item/weapon/spell/illusion/Destroy() /obj/item/weapon/spell/illusion/Destroy()
if(illusion) if(illusion)

View File

@@ -33,15 +33,24 @@
AM.forceMove(get_turf(src)) AM.forceMove(get_turf(src))
..() ..()
/obj/effect/phase_shift/relaymove(mob/user as mob)
if(user.stat)
return
user << "<span class='notice'>You step out of the rift.</span>"
user.forceMove(get_turf(src))
qdel(src)
/obj/item/weapon/spell/phase_shift/on_use_cast(mob/user) /obj/item/weapon/spell/phase_shift/on_use_cast(mob/user)
if(isturf(user.loc)) //Check if we're not already in a rift. if(isturf(user.loc)) //Check if we're not already in a rift.
if(pay_energy(2000))
var/obj/effect/phase_shift/PS = new(get_turf(user)) var/obj/effect/phase_shift/PS = new(get_turf(user))
visible_message("<span class='warning'>[user] vanishes into a pink rift!</span>") visible_message("<span class='warning'>[user] vanishes into a pink rift!</span>")
user << "<span class='info'>You create an unstable rift, and go through it. Be sure to not stay too long.</span>" user << "<span class='info'>You create an unstable rift, and go through it. Be sure to not stay too long.</span>"
user.forceMove(PS) user.forceMove(PS)
else //We're already in a rift, time to get out. adjust_instability(10)
if(istype(loc, /obj/effect/phase_shift))
var/obj/effect/phase_shift/PS = user.loc
qdel(PS) //Ejecting is handled in Destory()
visible_message("<span class='warning'>[user] reappears from the rift as it collapses.</span>")
qdel(src) qdel(src)
else
user << "<span class='warning'>You don't have enough energy to make a rift!</span>"
else //We're already in a rift or something like a closet.
user << "<span class='warning'>Making a rift here would probably be a bad idea.</span>"

View File

@@ -22,6 +22,7 @@
icon_state = "bluespace" icon_state = "bluespace"
// nodamage = 1 // nodamage = 1
damage_type = BURN damage_type = BURN
armor_penetration = 100
/obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user) /obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user)
energy_cost_per_shot = round(core.max_energy * 0.15) energy_cost_per_shot = round(core.max_energy * 0.15)

View File

@@ -43,6 +43,8 @@
/mob/living/simple_animal/ward/death() /mob/living/simple_animal/ward/death()
if(creator) if(creator)
creator << "<span class='danger'>Your ward inside [get_area(src)] was killed!</span>" creator << "<span class='danger'>Your ward inside [get_area(src)] was killed!</span>"
..()
qdel(src)
/mob/living/simple_animal/ward/proc/expire() /mob/living/simple_animal/ward/proc/expire()
if(creator && src) if(creator && src)

View File

@@ -39,6 +39,8 @@ var/list/technomancer_belongings = list()
for(var/mob/living/L in mob_list) for(var/mob/living/L in mob_list)
if(!is_ally(L) && !can_track_non_allies) if(!is_ally(L) && !can_track_non_allies)
continue continue
if(L == user)
continue
mob_choices += L mob_choices += L
var/choice = input(user,"Decide what or who to track.","Tracking") as null|anything in object_choices + mob_choices var/choice = input(user,"Decide what or who to track.","Tracking") as null|anything in object_choices + mob_choices
if(choice) if(choice)
@@ -58,9 +60,9 @@ var/list/technomancer_belongings = list()
icon_state = "track_unknown" icon_state = "track_unknown"
else else
set_dir(get_dir(src,tracked)) set_dir(get_dir(src,get_turf(tracked)))
switch(get_dist(src,tracked)) switch(get_dist(src,get_turf(tracked)))
if(0) if(0)
icon_state = "track_direct" icon_state = "track_direct"
if(1 to 8) if(1 to 8)

View File

@@ -343,10 +343,12 @@ var/global/datum/controller/occupations/job_master
permitted = 1 permitted = 1
if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted])) if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted]))
//if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
permitted = 0 permitted = 0
if(!permitted) if(!permitted)
H << "<span class='warning'>Your current job or whitelist status does not permit you to spawn with [thing]!</span>" H << "<span class='warning'>Your current species, job or whitelist status does not permit you to spawn with [thing]!</span>"
continue continue
if(G.slot && !(G.slot in custom_equip_slots)) if(G.slot && !(G.slot in custom_equip_slots))

View File

@@ -75,7 +75,7 @@ var/list/whitelist = list()
/proc/whitelist_overrides(mob/M) /proc/whitelist_overrides(mob/M)
if(!config.usealienwhitelist) if(!config.usealienwhitelist)
return 1 return 1
if(check_rights(R_ADMIN, 0)) if(check_rights(R_ADMIN, 0, M))
return 1 return 1
return 0 return 0

View File

@@ -419,7 +419,7 @@
visible_message("<span class='notice'>\The [src] rattles and prints out a sheet of paper.</span>") visible_message("<span class='notice'>\The [src] rattles and prints out a sheet of paper.</span>")
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
P.info = "<CENTER><B>Body Scan - [href_list["name"]]</B></CENTER><BR>" P.info = "<CENTER><B>Body Scan - [href_list["name"]]</B></CENTER><BR>"
P.info += "<b>Time of scan:</b> [worldtime2text(world.time)]<br><br>" P.info += "<b>Time of scan:</b> [worldtime2stationtime(world.time)]<br><br>"
P.info += "[printing_text]" P.info += "[printing_text]"
P.info += "<br><br><b>Notes:</b><br>" P.info += "<br><br><b>Notes:</b><br>"
P.name = "Body Scan - [href_list["name"]]" P.name = "Body Scan - [href_list["name"]]"

View File

@@ -250,7 +250,7 @@
var/obj/item/weapon/paper/P = new(loc) var/obj/item/weapon/paper/P = new(loc)
if (mode) if (mode)
P.name = text("crew manifest ([])", worldtime2text()) P.name = text("crew manifest ([])", stationtime2text())
P.info = {"<h4>Crew Manifest</h4> P.info = {"<h4>Crew Manifest</h4>
<br> <br>
[data_core ? data_core.get_manifest(0) : ""] [data_core ? data_core.get_manifest(0) : ""]

View File

@@ -20,17 +20,17 @@
/obj/item/weapon/card/id/guest/examine(mob/user) /obj/item/weapon/card/id/guest/examine(mob/user)
..(user) ..(user)
if (world.time < expiration_time) if (world.time < expiration_time)
user << "<span class='notice'>This pass expires at [worldtime2text(expiration_time)].</span>" user << "<span class='notice'>This pass expires at [worldtime2stationtime(expiration_time)].</span>"
else else
user << "<span class='warning'>It expired at [worldtime2text(expiration_time)].</span>" user << "<span class='warning'>It expired at [worldtime2stationtime(expiration_time)].</span>"
/obj/item/weapon/card/id/guest/read() /obj/item/weapon/card/id/guest/read()
if(!Adjacent(usr)) if(!Adjacent(usr))
return //Too far to read return //Too far to read
if (world.time > expiration_time) if (world.time > expiration_time)
usr << "<span class='notice'>This pass expired at [worldtime2text(expiration_time)].</span>" usr << "<span class='notice'>This pass expired at [worldtime2stationtime(expiration_time)].</span>"
else else
usr << "<span class='notice'>This pass expires at [worldtime2text(expiration_time)].</span>" usr << "<span class='notice'>This pass expires at [worldtime2stationtime(expiration_time)].</span>"
usr << "<span class='notice'>It grants access to following areas:</span>" usr << "<span class='notice'>It grants access to following areas:</span>"
for (var/A in temp_access) for (var/A in temp_access)
@@ -207,13 +207,13 @@
if ("issue") if ("issue")
if (giver) if (giver)
var/number = add_zero("[rand(0,9999)]", 4) var/number = add_zero("[rand(0,9999)]", 4)
var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: " var/entry = "\[[stationtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
for (var/i=1 to accesses.len) for (var/i=1 to accesses.len)
var/A = accesses[i] var/A = accesses[i]
if (A) if (A)
var/area = get_access_desc(A) var/area = get_access_desc(A)
entry += "[i > 1 ? ", [area]" : "[area]"]" entry += "[i > 1 ? ", [area]" : "[area]"]"
entry += ". Expires at [worldtime2text(world.time + duration*10*60)]." entry += ". Expires at [worldtime2stationtime(world.time + duration*10*60)]."
internal_log.Add(entry) internal_log.Add(entry)
var/obj/item/weapon/card/id/guest/pass = new(src.loc) var/obj/item/weapon/card/id/guest/pass = new(src.loc)

View File

@@ -454,7 +454,7 @@
var/counter = 1 var/counter = 1
while(src.active2.fields[text("com_[]", counter)]) while(src.active2.fields[text("com_[]", counter)])
counter++ counter++
src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]<BR>[t1]") src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]<BR>[t1]")
if (href_list["del_c"]) if (href_list["del_c"])
if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))

View File

@@ -391,7 +391,7 @@ What a mess.*/
var/counter = 1 var/counter = 1
while(active2.fields[text("com_[]", counter)]) while(active2.fields[text("com_[]", counter)])
counter++ counter++
active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]<BR>[t1]") active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]<BR>[t1]")
if ("Delete Record (ALL)") if ("Delete Record (ALL)")
if (active1) if (active1)

View File

@@ -461,7 +461,7 @@
var/counter = 1 var/counter = 1
while(src.active2.fields[text("com_[]", counter)]) while(src.active2.fields[text("com_[]", counter)])
counter++ counter++
src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]<BR>[t1]") src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]<BR>[t1]")
if (href_list["del_c"]) if (href_list["del_c"])
if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))

View File

@@ -410,7 +410,7 @@ What a mess.*/
var/counter = 1 var/counter = 1
while(active2.fields[text("com_[]", counter)]) while(active2.fields[text("com_[]", counter)])
counter++ counter++
active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]<BR>[t1]") active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]<BR>[t1]")
if ("Delete Record (ALL)") if ("Delete Record (ALL)")
if (active1) if (active1)

View File

@@ -201,7 +201,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = src.name T.source_terminal = src.name
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
D.transaction_log.Add(T) D.transaction_log.Add(T)
// //
T = new() T = new()
@@ -210,7 +210,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = src.name T.source_terminal = src.name
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
vendor_account.transaction_log.Add(T) vendor_account.transaction_log.Add(T)
newlap = new /obj/machinery/computer3/laptop/vended(src.loc) newlap = new /obj/machinery/computer3/laptop/vended(src.loc)
@@ -350,7 +350,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = src.name T.source_terminal = src.name
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
D.transaction_log.Add(T) D.transaction_log.Add(T)
// //
T = new() T = new()
@@ -359,7 +359,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = src.name T.source_terminal = src.name
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
vendor_account.transaction_log.Add(T) vendor_account.transaction_log.Add(T)
qdel(relap) qdel(relap)

View File

@@ -466,8 +466,8 @@
//Make an announcement and log the person entering storage. //Make an announcement and log the person entering storage.
control_computer.frozen_crew += "[occupant.real_name], [occupant.mind.role_alt_title] - [worldtime2text()]" control_computer.frozen_crew += "[occupant.real_name], [occupant.mind.role_alt_title] - [stationtime2text()]"
control_computer._admin_logs += "[key_name(occupant)] ([occupant.mind.role_alt_title]) at [worldtime2text()]" control_computer._admin_logs += "[key_name(occupant)] ([occupant.mind.role_alt_title]) at [stationtime2text()]"
log_and_message_admins("[key_name(occupant)] ([occupant.mind.role_alt_title]) entered cryostorage.") log_and_message_admins("[key_name(occupant)] ([occupant.mind.role_alt_title]) entered cryostorage.")
announce.autosay("[occupant.real_name], [occupant.mind.role_alt_title], [on_store_message]", "[on_store_name]") announce.autosay("[occupant.real_name], [occupant.mind.role_alt_title], [on_store_message]", "[on_store_name]")

View File

@@ -412,6 +412,8 @@ About the new airlock wires panel:
if(electrified_until && isAllPowerLoss()) if(electrified_until && isAllPowerLoss())
electrify(0) electrify(0)
update_icon()
/obj/machinery/door/airlock/proc/loseBackupPower() /obj/machinery/door/airlock/proc/loseBackupPower()
backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60)
@@ -419,6 +421,8 @@ About the new airlock wires panel:
if(electrified_until && isAllPowerLoss()) if(electrified_until && isAllPowerLoss())
electrify(0) electrify(0)
update_icon()
/obj/machinery/door/airlock/proc/regainMainPower() /obj/machinery/door/airlock/proc/regainMainPower()
if(!mainPowerCablesCut()) if(!mainPowerCablesCut())
main_power_lost_until = 0 main_power_lost_until = 0
@@ -426,11 +430,15 @@ About the new airlock wires panel:
if(!backup_power_lost_until) if(!backup_power_lost_until)
backup_power_lost_until = -1 backup_power_lost_until = -1
update_icon()
/obj/machinery/door/airlock/proc/regainBackupPower() /obj/machinery/door/airlock/proc/regainBackupPower()
if(!backupPowerCablesCut()) if(!backupPowerCablesCut())
// Restore backup power only if main power is offline, otherwise permanently disable // Restore backup power only if main power is offline, otherwise permanently disable
backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0
update_icon()
/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) /obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0)
var/message = "" var/message = ""
if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn()) if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn())

View File

@@ -64,6 +64,7 @@
bound_height = width * world.icon_size bound_height = width * world.icon_size
health = maxhealth health = maxhealth
update_icon()
update_nearby_tiles(need_rebuild=1) update_nearby_tiles(need_rebuild=1)
return return

View File

@@ -24,10 +24,16 @@
src.base_state = src.icon_state src.base_state = src.icon_state
return return
/obj/machinery/door/window/update_icon()
if(density)
icon_state = base_state
else
icon_state = "[base_state]open"
/obj/machinery/door/window/proc/shatter(var/display_message = 1) /obj/machinery/door/window/proc/shatter(var/display_message = 1)
new /obj/item/weapon/material/shard(src.loc) new /obj/item/weapon/material/shard(src.loc)
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc) new /obj/item/weapon/material/shard(src.loc)
CC.amount = 2 new /obj/item/stack/cable_coil(src.loc, 1)
var/obj/item/weapon/airlock_electronics/ae var/obj/item/weapon/airlock_electronics/ae
if(!electronics) if(!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc ) ae = new/obj/item/weapon/airlock_electronics( src.loc )
@@ -103,43 +109,39 @@
return 1 return 1
/obj/machinery/door/window/open() /obj/machinery/door/window/open()
if (src.operating == 1) //doors can still open when emag-disabled if (operating == 1) //doors can still open when emag-disabled
return 0 return 0
if (!ticker) if (!ticker)
return 0 return 0
if(!src.operating) //in case of emag if (!operating) //in case of emag
src.operating = 1 operating = 1
flick(text("[]opening", src.base_state), src) flick(text("[src.base_state]opening"), src)
playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
src.icon_state = text("[]open", src.base_state)
sleep(10) sleep(10)
explosion_resistance = 0 explosion_resistance = 0
src.density = 0 density = 0
// src.sd_SetOpacity(0) //TODO: why is this here? Opaque windoors? ~Carn update_icon()
update_nearby_tiles() update_nearby_tiles()
if(operating == 1) //emag again if(operating == 1) //emag again
src.operating = 0 operating = 0
return 1 return 1
/obj/machinery/door/window/close() /obj/machinery/door/window/close()
if (src.operating) if (operating)
return 0 return 0
src.operating = 1 src.operating = 1
flick(text("[]closing", src.base_state), src) flick(text("[]closing", src.base_state), src)
playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
src.icon_state = src.base_state
src.density = 1 density = 1
update_icon()
explosion_resistance = initial(explosion_resistance) explosion_resistance = initial(explosion_resistance)
// if(src.visible)
// SetOpacity(1) //TODO: why is this here? Opaque windoors? ~Carn
update_nearby_tiles() update_nearby_tiles()
sleep(10) sleep(10)
operating = 0
src.operating = 0
return 1 return 1
/obj/machinery/door/window/take_damage(var/damage) /obj/machinery/door/window/take_damage(var/damage)
@@ -197,12 +199,14 @@
var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc) var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc)
if (istype(src, /obj/machinery/door/window/brigdoor)) if (istype(src, /obj/machinery/door/window/brigdoor))
wa.secure = "secure_" wa.secure = "secure_"
wa.name = "Secure Wired Windoor Assembly" wa.name = "secure wired windoor assembly"
else else
wa.name = "Wired Windoor Assembly" wa.name = "wired windoor assembly"
if (src.base_state == "right" || src.base_state == "rightsecure") if (src.base_state == "right" || src.base_state == "rightsecure")
wa.facing = "r" wa.facing = "r"
wa.set_dir(src.dir) wa.set_dir(src.dir)
wa.anchored = 1
wa.created_name = name
wa.state = "02" wa.state = "02"
wa.update_icon() wa.update_icon()
@@ -223,7 +227,7 @@
ae.icon_state = "door_electronics_smoked" ae.icon_state = "door_electronics_smoked"
operating = 0 operating = 0
shatter(src) qdel(src)
return 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 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)
@@ -262,6 +266,10 @@
maxhealth = 300 maxhealth = 300
health = 300.0 //Stronger doors for prison (regular window door health is 150) health = 300.0 //Stronger doors for prison (regular window door health is 150)
/obj/machinery/door/window/brigdoor/shatter()
new /obj/item/stack/rods(src.loc, 2)
..()
/obj/machinery/door/window/northleft /obj/machinery/door/window/northleft
dir = NORTH dir = NORTH

View File

@@ -76,7 +76,7 @@
var/datum/feed_message/newMsg = new /datum/feed_message var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = author newMsg.author = author
newMsg.body = msg newMsg.body = msg
newMsg.time_stamp = "[worldtime2text()]" newMsg.time_stamp = "[stationtime2text()]"
newMsg.is_admin_message = adminMessage newMsg.is_admin_message = adminMessage
if(message_type) if(message_type)
newMsg.message_type = message_type newMsg.message_type = message_type

View File

@@ -150,7 +150,7 @@
return 1 return 1
if(STATUS_DISPLAY_TIME) if(STATUS_DISPLAY_TIME)
message1 = "TIME" message1 = "TIME"
message2 = worldtime2text() message2 = stationtime2text()
update_display(message1, message2) update_display(message1, message2)
return 1 return 1
return 0 return 0

View File

@@ -23,12 +23,6 @@ var/list/ai_status_emotions = list(
"Dorfy" = new /datum/ai_emotion("ai_urist"), "Dorfy" = new /datum/ai_emotion("ai_urist"),
"Facepalm" = new /datum/ai_emotion("ai_facepalm"), "Facepalm" = new /datum/ai_emotion("ai_facepalm"),
"Friend Computer" = new /datum/ai_emotion("ai_friend"), "Friend Computer" = new /datum/ai_emotion("ai_friend"),
"Your Best Friend" = new /datum/ai_emotion("ai_flowey"),
"Your Best Nightmare" = new /datum/ai_emotion("ai_floweymalf"),
"Soviet Union" = new /datum/ai_emotion("ai_soviet"),
"Holly" = new /datum/ai_emotion("ai_holly"),
"Hilly" = new /datum/ai_emotion("ai_hilly"),
"Fish" = new /datum/ai_emotion("ai_fishtank"),
"Tribunal" = new /datum/ai_emotion("ai_tribunal", "serithi"), "Tribunal" = new /datum/ai_emotion("ai_tribunal", "serithi"),
"Tribunal Malfunctioning" = new /datum/ai_emotion("ai_tribunal_malf", "serithi") "Tribunal Malfunctioning" = new /datum/ai_emotion("ai_tribunal_malf", "serithi")
) )

View File

@@ -314,7 +314,7 @@
T.amount = "[currently_vending.price]" T.amount = "[currently_vending.price]"
T.source_terminal = src.name T.source_terminal = src.name
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
customer_account.transaction_log.Add(T) customer_account.transaction_log.Add(T)
// Give the vendor the money. We use the account owner name, which means // Give the vendor the money. We use the account owner name, which means
@@ -337,7 +337,7 @@
T.amount = "[currently_vending.price]" T.amount = "[currently_vending.price]"
T.source_terminal = src.name T.source_terminal = src.name
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
vendor_account.transaction_log.Add(T) vendor_account.transaction_log.Add(T)
/obj/machinery/vending/attack_ai(mob/user as mob) /obj/machinery/vending/attack_ai(mob/user as mob)

View File

@@ -66,7 +66,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/examine(mob/user) /obj/item/device/pda/examine(mob/user)
if(..(user, 1)) if(..(user, 1))
user << "The time [worldtime2text()] is displayed in the corner of the screen." user << "The time [stationtime2text()] is displayed in the corner of the screen."
/obj/item/device/pda/medical /obj/item/device/pda/medical
default_cartridge = /obj/item/weapon/cartridge/medical default_cartridge = /obj/item/weapon/cartridge/medical
@@ -523,7 +523,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
cartdata["charges"] = cartridge.charges ? cartridge.charges : 0 cartdata["charges"] = cartridge.charges ? cartridge.charges : 0
data["cartridge"] = cartdata data["cartridge"] = cartdata
data["stationTime"] = worldtime2text() data["stationTime"] = stationtime2text()
data["new_Message"] = new_message data["new_Message"] = new_message
data["new_News"] = new_news data["new_News"] = new_news

View File

@@ -334,7 +334,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
data["video_comm"] = video_source ? "\ref[video_source.loc]" : null data["video_comm"] = video_source ? "\ref[video_source.loc]" : null
data["imContacts"] = im_contacts_ui data["imContacts"] = im_contacts_ui
data["imList"] = im_list_ui data["imList"] = im_list_ui
data["time"] = worldtime2text() data["time"] = stationtime2text()
data["ring"] = ringer data["ring"] = ringer
data["homeScreen"] = modules_ui data["homeScreen"] = modules_ui
data["note"] = note // current notes data["note"] = note // current notes

View File

@@ -4,7 +4,7 @@
w_class = 4 w_class = 4
icon = 'icons/obj/device.dmi' icon = 'icons/obj/device.dmi'
icon_state = "suitcooler0" icon_state = "suitcooler0"
slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage slot_flags = SLOT_BACK
//copied from tank.dm //copied from tank.dm
flags = CONDUCT flags = CONDUCT
@@ -20,7 +20,7 @@
var/on = 0 //is it turned on? var/on = 0 //is it turned on?
var/cover_open = 0 //is the cover open? var/cover_open = 0 //is the cover open?
var/obj/item/weapon/cell/cell var/obj/item/weapon/cell/cell
var/max_cooling = 12 // in degrees per second - probably don't need to mess with heat capacity here var/max_cooling = 15 // in degrees per second - probably don't need to mess with heat capacity here
var/charge_consumption = 3 // charge per second at max_cooling var/charge_consumption = 3 // charge per second at max_cooling
var/thermostat = T20C var/thermostat = T20C
@@ -87,7 +87,7 @@
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
if (!H.wear_suit || H.s_store != src) if (!H.wear_suit || (H.s_store != src && H.back != src))
return 0 return 0
return 1 return 1

View File

@@ -158,7 +158,7 @@
nanoui_data["categories"] = categories nanoui_data["categories"] = categories
nanoui_data["discount_name"] = discount_item ? discount_item.name : "" nanoui_data["discount_name"] = discount_item ? discount_item.name : ""
nanoui_data["discount_amount"] = (1-discount_amount)*100 nanoui_data["discount_amount"] = (1-discount_amount)*100
nanoui_data["offer_expiry"] = worldtime2text(next_offer_time) nanoui_data["offer_expiry"] = worldtime2stationtime(next_offer_time)
else if(nanoui_menu == 1) else if(nanoui_menu == 1)
var/items[0] var/items[0]
for(var/datum/uplink_item/item in category.items) for(var/datum/uplink_item/item in category.items)

View File

@@ -7,19 +7,16 @@
icon_state = "telecrystal" icon_state = "telecrystal"
w_class = 1 w_class = 1
max_amount = 240 max_amount = 240
flags = NOBLUDGEON
origin_tech = list(TECH_MATERIAL = 6, TECH_BLUESPACE = 4) origin_tech = list(TECH_MATERIAL = 6, TECH_BLUESPACE = 4)
force = 1 //Needs a token force to ensure you can attack because for some reason you can't attack with 0 force things
/obj/item/stack/telecrystal/afterattack(var/obj/item/I as obj, mob/user as mob, proximity) /obj/item/stack/telecrystal/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
if(!proximity) if(amount >= 5)
return target.visible_message("<span class='warning'>\The [target] has been transported with \the [src] by \the [user].</span>")
if(istype(I, /obj/item)) safe_blink(target, 14)
if(I.hidden_uplink && I.hidden_uplink.active) //No metagaming by using this on every PDA around just to see if it gets used up. use(5)
I.hidden_uplink.uses += amount else
I.hidden_uplink.update_nano_data() user << "<span class='warning'>There are not enough telecrystals to do that.</span>"
nanomanager.update_uis(I.hidden_uplink)
use(amount)
user << "<span class='notice'>You slot \the [src] into \the [I] and charge its internal uplink.</span>"
/obj/item/stack/telecrystal/attack_self(mob/user as mob) /obj/item/stack/telecrystal/attack_self(mob/user as mob)
if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals

View File

@@ -86,7 +86,7 @@
var/scan_data = "" var/scan_data = ""
if(timeofdeath) if(timeofdeath)
scan_data += "<b>Time of death:</b> [worldtime2text(timeofdeath)]<br><br>" scan_data += "<b>Time of death:</b> [worldtime2stationtime(timeofdeath)]<br><br>"
var/n = 1 var/n = 1
for(var/wdata_idx in wdata) for(var/wdata_idx in wdata)
@@ -133,7 +133,7 @@
if(damaging_weapon) if(damaging_weapon)
scan_data += "Severity: [damage_desc]<br>" scan_data += "Severity: [damage_desc]<br>"
scan_data += "Hits by weapon: [total_hits]<br>" scan_data += "Hits by weapon: [total_hits]<br>"
scan_data += "Approximate time of wound infliction: [worldtime2text(age)]<br>" scan_data += "Approximate time of wound infliction: [worldtime2stationtime(age)]<br>"
scan_data += "Affected limbs: [D.organ_names]<br>" scan_data += "Affected limbs: [D.organ_names]<br>"
scan_data += "Possible weapons:<br>" scan_data += "Possible weapons:<br>"
for(var/weapon_name in weapon_chances) for(var/weapon_name in weapon_chances)

View File

@@ -7,10 +7,10 @@
hitsound = 'sound/weapons/smash.ogg' hitsound = 'sound/weapons/smash.ogg'
flags = CONDUCT flags = CONDUCT
throwforce = 10 throwforce = 10
w_class = 3.0 w_class = 3
throw_speed = 2 throw_speed = 2
throw_range = 10 throw_range = 10
force = 10.0 force = 10
matter = list(DEFAULT_WALL_MATERIAL = 90) matter = list(DEFAULT_WALL_MATERIAL = 90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")

View File

@@ -17,7 +17,8 @@
//Explosive grenade projectile, borrowed from fragmentation grenade code. //Explosive grenade projectile, borrowed from fragmentation grenade code.
/obj/item/projectile/bullet/pellet/fragment /obj/item/projectile/bullet/pellet/fragment
damage = 10 damage = 10
range_step = 2 armor_penetration = 30
range_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer.
base_spread = 0 //causes it to be treated as a shrapnel explosion instead of cone base_spread = 0 //causes it to be treated as a shrapnel explosion instead of cone
spread_step = 20 spread_step = 20
@@ -32,9 +33,8 @@
icon_state = "frggrenade" icon_state = "frggrenade"
item_state = "grenade" item_state = "grenade"
var/num_fragments = 50 //total number of fragments produced by the grenade var/fragment_type = /obj/item/projectile/bullet/pellet/fragment
var/fragment_damage = 10 var/num_fragments = 63 //total number of fragments produced by the grenade
var/damage_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer.
var/explosion_size = 2 //size of the center explosion var/explosion_size = 2 //size of the center explosion
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern //The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
@@ -56,9 +56,7 @@
for(var/turf/T in target_turfs) for(var/turf/T in target_turfs)
var/obj/item/projectile/bullet/pellet/fragment/P = new (O) var/obj/item/projectile/bullet/pellet/fragment/P = new (O)
P.damage = fragment_damage
P.pellets = fragments_per_projectile P.pellets = fragments_per_projectile
P.range_step = damage_step
P.shot_from = src.name P.shot_from = src.name
P.launch(T) P.launch(T)

View File

@@ -8,8 +8,8 @@
sharp = 1 sharp = 1
edge = 1 edge = 1
w_class = 2 w_class = 2
force_divisor = 0.2 // 6 with hardness 30 (glass) force_divisor = 0.25 // 7.5 with hardness 30 (glass)
thrown_force_divisor = 0.4 // 4 with weight 15 (glass) thrown_force_divisor = 0.5
item_state = "shard-glass" item_state = "shard-glass"
attack_verb = list("stabbed", "slashed", "sliced", "cut") attack_verb = list("stabbed", "slashed", "sliced", "cut")
default_material = "glass" default_material = "glass"
@@ -87,7 +87,7 @@
if(affecting) if(affecting)
if(affecting.robotic >= ORGAN_ROBOT) if(affecting.robotic >= ORGAN_ROBOT)
return return
if(affecting.take_damage(5, 0)) if(affecting.take_damage(force, 0))
H.UpdateDamageIcon() H.UpdateDamageIcon()
H.updatehealth() H.updatehealth()
if(affecting.can_feel_pain()) if(affecting.can_feel_pain())

View File

@@ -214,25 +214,25 @@
name = "virologist satchel" name = "virologist satchel"
desc = "A sterile satchel with virologist colours." desc = "A sterile satchel with virologist colours."
icon_state = "satchel-vir" icon_state = "satchel-vir"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
/obj/item/weapon/storage/backpack/satchel/chem /obj/item/weapon/storage/backpack/satchel/chem
name = "chemist satchel" name = "chemist satchel"
desc = "A sterile satchel with chemist colours." desc = "A sterile satchel with chemist colours."
icon_state = "satchel-chem" icon_state = "satchel-chem"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
/obj/item/weapon/storage/backpack/satchel/gen /obj/item/weapon/storage/backpack/satchel/gen
name = "geneticist satchel" name = "geneticist satchel"
desc = "A sterile satchel with geneticist colours." desc = "A sterile satchel with geneticist colours."
icon_state = "satchel-gen" icon_state = "satchel-gen"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") item_state_slots = list(slot_r_hand_str = "genpack", slot_l_hand_str = "genpack")
/obj/item/weapon/storage/backpack/satchel/tox /obj/item/weapon/storage/backpack/satchel/tox
name = "scientist satchel" name = "scientist satchel"
desc = "Useful for holding research materials." desc = "Useful for holding research materials."
icon_state = "satchel-tox" icon_state = "satchel-tox"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
/obj/item/weapon/storage/backpack/satchel/sec /obj/item/weapon/storage/backpack/satchel/sec
name = "security satchel" name = "security satchel"

View File

@@ -2,7 +2,7 @@
name = "belt" name = "belt"
desc = "Can hold various things." desc = "Can hold various things."
icon = 'icons/obj/clothing/belts.dmi' icon = 'icons/obj/clothing/belts.dmi'
icon_state = "utilitybelt" icon_state = "utility"
storage_slots = 7 storage_slots = 7
max_storage_space = 28 //This should ensure belts always have enough room to store whatever. max_storage_space = 28 //This should ensure belts always have enough room to store whatever.
max_w_class = 3 max_w_class = 3
@@ -27,11 +27,10 @@
var/mob/M = src.loc var/mob/M = src.loc
M.update_inv_belt() M.update_inv_belt()
/obj/item/weapon/storage/belt/utility /obj/item/weapon/storage/belt/utility
name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing. name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing.
desc = "Can hold various tools." desc = "Can hold various tools."
icon_state = "utilitybelt" icon_state = "utility"
can_hold = list( can_hold = list(
///obj/item/weapon/combitool, ///obj/item/weapon/combitool,
/obj/item/weapon/crowbar, /obj/item/weapon/crowbar,
@@ -59,7 +58,6 @@
/obj/item/weapon/tape_roll, /obj/item/weapon/tape_roll,
) )
/obj/item/weapon/storage/belt/utility/full/New() /obj/item/weapon/storage/belt/utility/full/New()
..() ..()
new /obj/item/weapon/screwdriver(src) new /obj/item/weapon/screwdriver(src)
@@ -69,7 +67,6 @@
new /obj/item/weapon/wirecutters(src) new /obj/item/weapon/wirecutters(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange")) new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
/obj/item/weapon/storage/belt/utility/atmostech/New() /obj/item/weapon/storage/belt/utility/atmostech/New()
..() ..()
new /obj/item/weapon/screwdriver(src) new /obj/item/weapon/screwdriver(src)
@@ -79,12 +76,10 @@
new /obj/item/weapon/wirecutters(src) new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src) new /obj/item/device/t_scanner(src)
/obj/item/weapon/storage/belt/medical /obj/item/weapon/storage/belt/medical
name = "medical belt" name = "medical belt"
desc = "Can hold various medical equipment." desc = "Can hold various medical equipment."
icon_state = "medicalbelt" icon_state = "medical"
can_hold = list( can_hold = list(
/obj/item/device/healthanalyzer, /obj/item/device/healthanalyzer,
/obj/item/weapon/dnainjector, /obj/item/weapon/dnainjector,
@@ -115,12 +110,12 @@
/obj/item/weapon/storage/belt/medical/emt /obj/item/weapon/storage/belt/medical/emt
name = "EMT utility belt" name = "EMT utility belt"
desc = "A sturdy black webbing belt with attached pouches." desc = "A sturdy black webbing belt with attached pouches."
icon_state = "emsbelt" icon_state = "ems"
/obj/item/weapon/storage/belt/security /obj/item/weapon/storage/belt/security
name = "security belt" name = "security belt"
desc = "Can hold security gear like handcuffs and flashes." desc = "Can hold security gear like handcuffs and flashes."
icon_state = "securitybelt" icon_state = "security"
max_w_class = 3 max_w_class = 3
can_hold = list( can_hold = list(
/obj/item/weapon/grenade, /obj/item/weapon/grenade,
@@ -150,7 +145,7 @@
/obj/item/weapon/storage/belt/detective /obj/item/weapon/storage/belt/detective
name = "forensic utility belt" name = "forensic utility belt"
desc = "A belt for holding forensics equipment." desc = "A belt for holding forensics equipment."
icon_state = "securitybelt" icon_state = "security"
storage_slots = 7 storage_slots = 7
max_w_class = 3 max_w_class = 3
can_hold = list( can_hold = list(
@@ -190,7 +185,7 @@
/obj/item/weapon/storage/belt/soulstone /obj/item/weapon/storage/belt/soulstone
name = "soul stone belt" name = "soul stone belt"
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away" desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"
icon_state = "soulstonebelt" icon_state = "soulstone"
storage_slots = 6 storage_slots = 6
can_hold = list( can_hold = list(
/obj/item/device/soulstone /obj/item/device/soulstone
@@ -209,7 +204,7 @@
/obj/item/weapon/storage/belt/champion /obj/item/weapon/storage/belt/champion
name = "championship belt" name = "championship belt"
desc = "Proves to the world that you are the strongest!" desc = "Proves to the world that you are the strongest!"
icon_state = "championbelt" icon_state = "champion"
storage_slots = 1 storage_slots = 1
can_hold = list( can_hold = list(
"/obj/item/clothing/mask/luchador" "/obj/item/clothing/mask/luchador"
@@ -218,7 +213,7 @@
/obj/item/weapon/storage/belt/security/tactical /obj/item/weapon/storage/belt/security/tactical
name = "combat belt" name = "combat belt"
desc = "Can hold security gear like handcuffs and flashes, with more pouches for more storage." desc = "Can hold security gear like handcuffs and flashes, with more pouches for more storage."
icon_state = "swatbelt" icon_state = "swat"
storage_slots = 9 storage_slots = 9
max_w_class = 3 max_w_class = 3
max_storage_space = 28 max_storage_space = 28
@@ -231,7 +226,7 @@
/obj/item/weapon/storage/belt/janitor /obj/item/weapon/storage/belt/janitor
name = "janitorial belt" name = "janitorial belt"
desc = "A belt used to hold most janitorial supplies." desc = "A belt used to hold most janitorial supplies."
icon_state = "janibelt" icon_state = "janitor"
storage_slots = 7 storage_slots = 7
max_w_class = 3 max_w_class = 3
can_hold = list( can_hold = list(
@@ -251,3 +246,33 @@
/obj/item/weapon/reagent_containers/spray, /obj/item/weapon/reagent_containers/spray,
/obj/item/weapon/soap /obj/item/weapon/soap
) )
/obj/item/weapon/storage/belt/archaeology
name = "excavation gear-belt"
desc = "Can hold various excavation gear."
icon_state = "gear"
can_hold = list(
/obj/item/weapon/storage/box/samplebags,
/obj/item/device/core_sampler,
/obj/item/device/beacon_locator,
/obj/item/device/radio/beacon,
/obj/item/device/gps,
/obj/item/device/measuring_tape,
/obj/item/device/flashlight,
/obj/item/weapon/pickaxe,
/obj/item/device/depth_scanner,
/obj/item/device/camera,
/obj/item/weapon/paper,
/obj/item/weapon/photo,
/obj/item/weapon/folder,
/obj/item/weapon/pen,
/obj/item/weapon/folder,
/obj/item/weapon/clipboard,
/obj/item/weapon/anodevice,
/obj/item/clothing/glasses,
/obj/item/weapon/wrench,
/obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
/obj/item/device/ano_scanner,
/obj/item/weapon/pickaxe/hand
)

View File

@@ -5,7 +5,7 @@
icon_state = "red" icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
flags = CONDUCT flags = CONDUCT
force = 5 force = 10
throwforce = 10 throwforce = 10
throw_speed = 1 throw_speed = 1
throw_range = 7 throw_range = 7
@@ -67,7 +67,7 @@
icon_state = "syndicate" icon_state = "syndicate"
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1) origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1)
force = 7.0 force = 14
/obj/item/weapon/storage/toolbox/syndicate/New() /obj/item/weapon/storage/toolbox/syndicate/New()
..() ..()

View File

@@ -266,3 +266,18 @@
new /obj/item/clothing/gloves/arm_guard/combat(src) new /obj/item/clothing/gloves/arm_guard/combat(src)
new /obj/item/clothing/shoes/leg_guard/combat(src) new /obj/item/clothing/shoes/leg_guard/combat(src)
return return
/obj/item/weapon/storage/box/syndie_kit/demolitions/New()
..()
new /obj/item/weapon/syndie/c4explosive(src)
new /obj/item/weapon/screwdriver(src)
/obj/item/weapon/storage/box/syndie_kit/demolitions_heavy/New()
..()
new /obj/item/weapon/syndie/c4explosive/heavy(src)
new /obj/item/weapon/screwdriver(src)
/obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy/New()
..()
new /obj/item/weapon/syndie/c4explosive/heavy/super_heavy(src)
new /obj/item/weapon/screwdriver(src)

View File

@@ -23,19 +23,23 @@
power = 2 power = 2
size = "large" size = "large"
/obj/item/weapon/syndie/c4explosive/heavy/super_heavy
name = "large-sized package"
desc = "A mysterious package, it's quite exceptionally heavy."
power = 3
/obj/item/weapon/syndie/c4explosive/New() /obj/item/weapon/syndie/c4explosive/New()
var/K = rand(1,2000) var/K = rand(1,2000)
K = md5(num2text(K)+name) K = md5(num2text(K)+name)
K = copytext(K,1,7) K = copytext(K,1,7)
src.desc += "\n You see [K] engraved on \the [src]." desc += "\n You see [K] engraved on \the [src]."
var/obj/item/weapon/syndie/c4detonator/detonator = new(src.loc) var/obj/item/weapon/flame/lighter/zippo/c4detonator/detonator = new(src.loc)
detonator.desc += "\n You see [K] engraved on the lighter." detonator.desc += " You see [K] engraved on the lighter."
detonator.bomb = src detonator.bomb = src
/obj/item/weapon/syndie/c4explosive/proc/detonate() /obj/item/weapon/syndie/c4explosive/proc/detonate()
icon_state = "c-4[size]_1" icon_state = "c-4[size]_1"
spawn(50) explosion(get_turf(src), power, power*2, power*3, power*4, power*5)
explosion(get_turf(src), power, power*2, power*3, power*4, power*4)
for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors. for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors.
var/turf/simulated/wall/T = get_step(src,dirn) var/turf/simulated/wall/T = get_step(src,dirn)
if(locate(/obj/machinery/door/airlock) in T) if(locate(/obj/machinery/door/airlock) in T)
@@ -50,35 +54,39 @@
/*Detonator, disguised as a lighter*/ /*Detonator, disguised as a lighter*/
/*Click it when closed to open, when open to bring up a prompt asking you if you want to close it or press the button.*/ /*Click it when closed to open, when open to bring up a prompt asking you if you want to close it or press the button.*/
/obj/item/weapon/syndie/c4detonator /obj/item/weapon/flame/lighter/zippo/c4detonator
icon_state = "c-4detonator_0" var/detonator_mode = 0
item_state = "zippo"
name = "\improper Zippo lighter" /*Sneaky, thanks Dreyfus.*/
desc = "The zippo."
w_class = 1
var/obj/item/weapon/syndie/c4explosive/bomb var/obj/item/weapon/syndie/c4explosive/bomb
var/pr_open = 0 /*Is the "What do you want to do?" prompt open?*/
/obj/item/weapon/syndie/c4detonator/attack_self(mob/user as mob) /obj/item/weapon/flame/lighter/zippo/c4detonator/attack_self(mob/user as mob)
switch(src.icon_state) if(!detonator_mode)
if("c-4detonator_0") ..()
src.icon_state = "c-4detonator_1"
user << "You flick open the lighter."
if("c-4detonator_1") else if(!lit)
if(!pr_open) base_state = icon_state
pr_open = 1 lit = 1
icon_state = "[base_state]1"
//item_state = "[base_state]on"
user.visible_message("<span class='rose'>Without even breaking stride, \the [user] flips open \the [src] in one smooth movement.</span>")
else if(lit && detonator_mode)
switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter.")) switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter."))
if("Press the button.") if("Press the button.")
user << "<span class='warning'>You press the button.</span>" user << "<span class='warning'>You press the button.</span>"
flick("c-4detonator_click", src) icon_state = "[base_state]click"
if(src.bomb) if(src.bomb)
src.bomb.detonate() src.bomb.detonate()
log_admin("[key_name(user)] has triggered [src.bomb] with [src].") log_admin("[key_name(user)] has triggered [src.bomb] with [src].")
message_admins("<span class='danger'>[key_name_admin(user)] has triggered [src.bomb] with [src].</span>") message_admins("<span class='danger'>[key_name_admin(user)] has triggered [src.bomb] with [src].</span>")
if("Close the lighter.") if("Close the lighter.")
src.icon_state = "c-4detonator_0" lit = 0
user << "You close the lighter." icon_state = "[base_state]"
pr_open = 0 //item_state = "[base_state]"
user.visible_message("<span class='rose'>You hear a quiet click, as \the [user] shuts off \the [src] without even looking at what they're doing.</span>")
/obj/item/weapon/flame/lighter/zippo/c4detonator/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/weapon/screwdriver))
detonator_mode = !detonator_mode
user << "<span class='notice'>You unscrew the top panel of \the [src] revealing a button.</span>"

View File

@@ -21,9 +21,9 @@
icon_state = "wrench" icon_state = "wrench"
flags = CONDUCT flags = CONDUCT
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
force = 5.0 force = 6
throwforce = 7.0 throwforce = 7
w_class = 2.0 w_class = 2
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
matter = list(DEFAULT_WALL_MATERIAL = 150) matter = list(DEFAULT_WALL_MATERIAL = 150)
attack_verb = list("bashed", "battered", "bludgeoned", "whacked") attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
@@ -39,9 +39,9 @@
icon_state = "screwdriver" icon_state = "screwdriver"
flags = CONDUCT flags = CONDUCT
slot_flags = SLOT_BELT | SLOT_EARS slot_flags = SLOT_BELT | SLOT_EARS
force = 5.0 force = 6
w_class = 1.0 w_class = 1
throwforce = 5.0 throwforce = 5
throw_speed = 3 throw_speed = 3
throw_range = 5 throw_range = 5
matter = list(DEFAULT_WALL_MATERIAL = 75) matter = list(DEFAULT_WALL_MATERIAL = 75)
@@ -100,7 +100,7 @@
icon_state = "cutters" icon_state = "cutters"
flags = CONDUCT flags = CONDUCT
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
force = 6.0 force = 6
throw_speed = 2 throw_speed = 2
throw_range = 9 throw_range = 9
w_class = 2.0 w_class = 2.0
@@ -411,11 +411,11 @@
icon_state = "crowbar" icon_state = "crowbar"
flags = CONDUCT flags = CONDUCT
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
force = 5.0 force = 6
throwforce = 7.0 throwforce = 7
pry = 1 pry = 1
item_state = "crowbar" item_state = "crowbar"
w_class = 2.0 w_class = 2
origin_tech = list(TECH_ENGINEERING = 1) origin_tech = list(TECH_ENGINEERING = 1)
matter = list(DEFAULT_WALL_MATERIAL = 50) matter = list(DEFAULT_WALL_MATERIAL = 50)
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")

View File

@@ -114,6 +114,8 @@
new /obj/item/weapon/shield/riot/tele(src) new /obj/item/weapon/shield/riot/tele(src)
new /obj/item/weapon/storage/box/holobadge/hos(src) new /obj/item/weapon/storage/box/holobadge/hos(src)
new /obj/item/clothing/accessory/badge/holo/hos(src) new /obj/item/clothing/accessory/badge/holo/hos(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/crowbar/red(src)
new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src) new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src) new /obj/item/device/flash(src)

View File

@@ -7,7 +7,7 @@
w_class = 5 w_class = 5
var/state = 0 var/state = 0
var/base_icon_state = "" var/base_icon_state = ""
var/base_name = "Airlock" var/base_name = "airlock"
var/obj/item/weapon/airlock_electronics/electronics = null var/obj/item/weapon/airlock_electronics/electronics = null
var/airlock_type = "" //the type path of the airlock once completed var/airlock_type = "" //the type path of the airlock once completed
var/glass_type = "/glass" var/glass_type = "/glass"
@@ -19,91 +19,91 @@
/obj/structure/door_assembly/door_assembly_com /obj/structure/door_assembly/door_assembly_com
base_icon_state = "com" base_icon_state = "com"
base_name = "Command Airlock" base_name = "Command airlock"
glass_type = "/glass_command" glass_type = "/glass_command"
airlock_type = "/command" airlock_type = "/command"
/obj/structure/door_assembly/door_assembly_sec /obj/structure/door_assembly/door_assembly_sec
base_icon_state = "sec" base_icon_state = "sec"
base_name = "Security Airlock" base_name = "Security airlock"
glass_type = "/glass_security" glass_type = "/glass_security"
airlock_type = "/security" airlock_type = "/security"
/obj/structure/door_assembly/door_assembly_eng /obj/structure/door_assembly/door_assembly_eng
base_icon_state = "eng" base_icon_state = "eng"
base_name = "Engineering Airlock" base_name = "Engineering airlock"
glass_type = "/glass_engineering" glass_type = "/glass_engineering"
airlock_type = "/engineering" airlock_type = "/engineering"
/obj/structure/door_assembly/door_assembly_eat /obj/structure/door_assembly/door_assembly_eat
base_icon_state = "eat" base_icon_state = "eat"
base_name = "Engineering Atmos Airlock" base_name = "Engineering atmos airlock"
glass_type = "/glass_engineeringatmos" glass_type = "/glass_engineeringatmos"
airlock_type = "/engineering" airlock_type = "/engineering"
/obj/structure/door_assembly/door_assembly_min /obj/structure/door_assembly/door_assembly_min
base_icon_state = "min" base_icon_state = "min"
base_name = "Mining Airlock" base_name = "Mining airlock"
glass_type = "/glass_mining" glass_type = "/glass_mining"
airlock_type = "/mining" airlock_type = "/mining"
/obj/structure/door_assembly/door_assembly_atmo /obj/structure/door_assembly/door_assembly_atmo
base_icon_state = "atmo" base_icon_state = "atmo"
base_name = "Atmospherics Airlock" base_name = "Atmospherics airlock"
glass_type = "/glass_atmos" glass_type = "/glass_atmos"
airlock_type = "/atmos" airlock_type = "/atmos"
/obj/structure/door_assembly/door_assembly_research /obj/structure/door_assembly/door_assembly_research
base_icon_state = "res" base_icon_state = "res"
base_name = "Research Airlock" base_name = "Research airlock"
glass_type = "/glass_research" glass_type = "/glass_research"
airlock_type = "/research" airlock_type = "/research"
/obj/structure/door_assembly/door_assembly_science /obj/structure/door_assembly/door_assembly_science
base_icon_state = "sci" base_icon_state = "sci"
base_name = "Science Airlock" base_name = "Science airlock"
glass_type = "/glass_science" glass_type = "/glass_science"
airlock_type = "/science" airlock_type = "/science"
/obj/structure/door_assembly/door_assembly_med /obj/structure/door_assembly/door_assembly_med
base_icon_state = "med" base_icon_state = "med"
base_name = "Medical Airlock" base_name = "Medical airlock"
glass_type = "/glass_medical" glass_type = "/glass_medical"
airlock_type = "/medical" airlock_type = "/medical"
/obj/structure/door_assembly/door_assembly_mai /obj/structure/door_assembly/door_assembly_mai
base_icon_state = "mai" base_icon_state = "mai"
base_name = "Maintenance Airlock" base_name = "Maintenance airlock"
airlock_type = "/maintenance" airlock_type = "/maintenance"
glass = -1 glass = -1
/obj/structure/door_assembly/door_assembly_ext /obj/structure/door_assembly/door_assembly_ext
base_icon_state = "ext" base_icon_state = "ext"
base_name = "External Airlock" base_name = "External airlock"
airlock_type = "/external" airlock_type = "/external"
glass = -1 glass = -1
/obj/structure/door_assembly/door_assembly_fre /obj/structure/door_assembly/door_assembly_fre
base_icon_state = "fre" base_icon_state = "fre"
base_name = "Freezer Airlock" base_name = "Freezer airlock"
airlock_type = "/freezer" airlock_type = "/freezer"
glass = -1 glass = -1
/obj/structure/door_assembly/door_assembly_hatch /obj/structure/door_assembly/door_assembly_hatch
base_icon_state = "hatch" base_icon_state = "hatch"
base_name = "Airtight Hatch" base_name = "airtight hatch"
airlock_type = "/hatch" airlock_type = "/hatch"
glass = -1 glass = -1
/obj/structure/door_assembly/door_assembly_mhatch /obj/structure/door_assembly/door_assembly_mhatch
base_icon_state = "mhatch" base_icon_state = "mhatch"
base_name = "Maintenance Hatch" base_name = "maintenance hatch"
airlock_type = "/maintenance_hatch" airlock_type = "/maintenance_hatch"
glass = -1 glass = -1
/obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly /obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
base_icon_state = "highsec" base_icon_state = "highsec"
base_name = "High Security Airlock" base_name = "high security airlock"
airlock_type = "/highsecurity" airlock_type = "/highsecurity"
glass = -1 glass = -1
@@ -221,7 +221,6 @@
W.loc = src W.loc = src
user << "<span class='notice'>You installed the airlock electronics!</span>" user << "<span class='notice'>You installed the airlock electronics!</span>"
src.state = 2 src.state = 2
src.name = "Near finished Airlock Assembly"
src.electronics = W src.electronics = W
else if(istype(W, /obj/item/weapon/crowbar) && state == 2 ) else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
@@ -238,7 +237,6 @@
if(!src) return if(!src) return
user << "<span class='notice'>You removed the airlock electronics!</span>" user << "<span class='notice'>You removed the airlock electronics!</span>"
src.state = 1 src.state = 1
src.name = "Wired Airlock Assembly"
electronics.loc = src.loc electronics.loc = src.loc
electronics = null electronics = null
@@ -294,9 +292,9 @@
switch (state) switch (state)
if(0) if(0)
if (anchored) if (anchored)
name = "Secured " name = "secured "
if(1) if(1)
name = "Wired " name = "wired "
if(2) if(2)
name = "Near Finished " name = "near finished "
name += "[glass == 1 ? "Window " : ""][istext(glass) ? "[glass] Airlock" : base_name] Assembly" name += "[glass == 1 ? "window " : ""][istext(glass) ? "[glass] airlock" : base_name] assembly ([created_name])"

View File

@@ -126,7 +126,8 @@
return ..() return ..()
/obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user) /obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user)
if(S.get_amount() < 2) var/amount_to_use = reinf_material ? 1 : 2
if(S.get_amount() < amount_to_use)
user << "<span class='notice'>There isn't enough material here to construct a wall.</span>" user << "<span class='notice'>There isn't enough material here to construct a wall.</span>"
return 0 return 0
@@ -143,7 +144,6 @@
user << "<span class='notice'>You begin adding the plating...</span>" user << "<span class='notice'>You begin adding the plating...</span>"
var/amount_to_use = reinf_material ? 1 : 2
if(!do_after(user,40) || !S.use(amount_to_use)) if(!do_after(user,40) || !S.use(amount_to_use))
return 1 //once we've gotten this far don't call parent attackby() return 1 //once we've gotten this far don't call parent attackby()

View File

@@ -19,12 +19,18 @@ obj/structure/windoor_assembly
w_class = 3 w_class = 3
var/obj/item/weapon/airlock_electronics/electronics = null var/obj/item/weapon/airlock_electronics/electronics = null
var/created_name = null
//Vars to help with the icon's name //Vars to help with the icon's name
var/facing = "l" //Does the windoor open to the left or right? var/facing = "l" //Does the windoor open to the left or right?
var/secure = "" //Whether or not this creates a secure windoor var/secure = "" //Whether or not this creates a secure windoor
var/state = "01" //How far the door assembly has progressed in terms of sprites var/state = "01" //How far the door assembly has progressed in terms of sprites
obj/structure/windoor_assembly/secure
name = "secure windoor assembly"
secure = "secure_"
icon_state = "l_secure_windoor_assembly01"
obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0) obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0)
..() ..()
if(constructed) if(constructed)
@@ -65,24 +71,31 @@ obj/structure/windoor_assembly/Destroy()
/obj/structure/windoor_assembly/attackby(obj/item/W as obj, mob/user as mob) /obj/structure/windoor_assembly/attackby(obj/item/W as obj, mob/user as mob)
//I really should have spread this out across more states but thin little windoors are hard to sprite. if(istype(W, /obj/item/weapon/pen))
var/t = sanitizeSafe(input(user, "Enter the name for the windoor.", src.name, src.created_name), MAX_NAME_LEN)
if(!t) return
if(!in_range(src, usr) && src.loc != usr) return
created_name = t
return
switch(state) switch(state)
if("01") if("01")
if(istype(W, /obj/item/weapon/weldingtool) && !anchored ) if(istype(W, /obj/item/weapon/weldingtool) && !anchored )
var/obj/item/weapon/weldingtool/WT = W var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0,user)) if (WT.remove_fuel(0,user))
user.visible_message("[user] dissassembles the windoor assembly.", "You start to dissassemble the windoor assembly.") user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly.")
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
if(do_after(user, 40)) if(do_after(user, 40))
if(!src || !WT.isOn()) return if(!src || !WT.isOn()) return
user << "<span class='notice'>You dissasembled the windoor assembly!</span>" user << "<span class='notice'>You disassembled the windoor assembly!</span>"
new /obj/item/stack/material/glass/reinforced(get_turf(src), 5)
if(secure) if(secure)
PoolOrNew(/obj/item/stack/rods, list(get_turf(src), 4)) new /obj/item/stack/material/glass/reinforced(get_turf(src), 2)
else
new /obj/item/stack/material/glass(get_turf(src), 2)
qdel(src) qdel(src)
else else
user << "<span class='notice'>You need more welding fuel to dissassemble the windoor assembly.</span>" user << "<span class='notice'>You need more welding fuel to disassemble the windoor assembly.</span>"
return return
//Wrenching an unsecure assembly anchors it in place. Step 4 complete //Wrenching an unsecure assembly anchors it in place. Step 4 complete
@@ -95,9 +108,9 @@ obj/structure/windoor_assembly/Destroy()
user << "<span class='notice'>You've secured the windoor assembly!</span>" user << "<span class='notice'>You've secured the windoor assembly!</span>"
src.anchored = 1 src.anchored = 1
if(src.secure) if(src.secure)
src.name = "Secure Anchored Windoor Assembly" src.name = "secure anchored windoor assembly"
else else
src.name = "Anchored Windoor Assembly" src.name = "anchored windoor assembly"
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone //Unwrenching an unsecure assembly un-anchors it. Step 4 undone
else if(istype(W, /obj/item/weapon/wrench) && anchored) else if(istype(W, /obj/item/weapon/wrench) && anchored)
@@ -109,26 +122,9 @@ obj/structure/windoor_assembly/Destroy()
user << "<span class='notice'>You've unsecured the windoor assembly!</span>" user << "<span class='notice'>You've unsecured the windoor assembly!</span>"
src.anchored = 0 src.anchored = 0
if(src.secure) if(src.secure)
src.name = "Secure Windoor Assembly" src.name = "secure windoor assembly"
else else
src.name = "Windoor Assembly" src.name = "windoor assembly"
//Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
else if(istype(W, /obj/item/stack/rods) && !secure)
var/obj/item/stack/rods/R = W
if(R.get_amount() < 4)
user << "<span class='warning'>You need more rods to do this.</span>"
return
user << "<span class='notice'>You start to reinforce the windoor with rods.</span>"
if(do_after(user,40) && !secure)
if (R.use(4))
user << "<span class='notice'>You reinforce the windoor.</span>"
src.secure = "secure_"
if(src.anchored)
src.name = "Secure Anchored Windoor Assembly"
else
src.name = "Secure Windoor Assembly"
//Adding cable to the assembly. Step 5 complete. //Adding cable to the assembly. Step 5 complete.
else if(istype(W, /obj/item/stack/cable_coil) && anchored) else if(istype(W, /obj/item/stack/cable_coil) && anchored)
@@ -140,9 +136,9 @@ obj/structure/windoor_assembly/Destroy()
user << "<span class='notice'>You wire the windoor!</span>" user << "<span class='notice'>You wire the windoor!</span>"
src.state = "02" src.state = "02"
if(src.secure) if(src.secure)
src.name = "Secure Wired Windoor Assembly" src.name = "secure wired windoor assembly"
else else
src.name = "Wired Windoor Assembly" src.name = "wired windoor assembly"
else else
..() ..()
@@ -160,9 +156,9 @@ obj/structure/windoor_assembly/Destroy()
new/obj/item/stack/cable_coil(get_turf(user), 1) new/obj/item/stack/cable_coil(get_turf(user), 1)
src.state = "01" src.state = "01"
if(src.secure) if(src.secure)
src.name = "Secure Anchored Windoor Assembly" src.name = "secure anchored windoor assembly"
else else
src.name = "Anchored Windoor Assembly" src.name = "anchored windoor assembly"
//Adding airlock electronics for access. Step 6 complete. //Adding airlock electronics for access. Step 6 complete.
else if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked") else if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked")
@@ -175,7 +171,7 @@ obj/structure/windoor_assembly/Destroy()
user.drop_item() user.drop_item()
W.loc = src W.loc = src
user << "<span class='notice'>You've installed the airlock electronics!</span>" user << "<span class='notice'>You've installed the airlock electronics!</span>"
src.name = "Near finished Windoor Assembly" src.name = "near finished windoor assembly"
src.electronics = W src.electronics = W
else else
W.loc = src.loc W.loc = src.loc
@@ -189,9 +185,9 @@ obj/structure/windoor_assembly/Destroy()
if(!src || !src.electronics) return if(!src || !src.electronics) return
user << "<span class='notice'>You've removed the airlock electronics!</span>" user << "<span class='notice'>You've removed the airlock electronics!</span>"
if(src.secure) if(src.secure)
src.name = "Secure Wired Windoor Assembly" src.name = "secure wired windoor assembly"
else else
src.name = "Wired Windoor Assembly" src.name = "wired windoor assembly"
var/obj/item/weapon/airlock_electronics/ae = electronics var/obj/item/weapon/airlock_electronics/ae = electronics
electronics = null electronics = null
ae.loc = src.loc ae.loc = src.loc
@@ -222,6 +218,9 @@ obj/structure/windoor_assembly/Destroy()
windoor.base_state = "rightsecure" windoor.base_state = "rightsecure"
windoor.set_dir(src.dir) windoor.set_dir(src.dir)
windoor.density = 0 windoor.density = 0
windoor.name = created_name
spawn(0)
windoor.close()
if(src.electronics.one_access) if(src.electronics.one_access)
windoor.req_access = null windoor.req_access = null
@@ -240,6 +239,9 @@ obj/structure/windoor_assembly/Destroy()
windoor.base_state = "right" windoor.base_state = "right"
windoor.set_dir(src.dir) windoor.set_dir(src.dir)
windoor.density = 0 windoor.density = 0
windoor.name = created_name
spawn(0)
windoor.close()
if(src.electronics.one_access) if(src.electronics.one_access)
windoor.req_access = null windoor.req_access = null
@@ -257,8 +259,11 @@ obj/structure/windoor_assembly/Destroy()
..() ..()
//Update to reflect changes(if applicable) //Update to reflect changes(if applicable)
update_icon() update_state()
/obj/structure/windoor_assembly/proc/update_state()
update_icon()
name += " ([created_name])"
//Rotates the windoor assembly clockwise //Rotates the windoor assembly clockwise
/obj/structure/windoor_assembly/verb/revrotate() /obj/structure/windoor_assembly/verb/revrotate()

View File

@@ -161,6 +161,7 @@
if(reinf) tforce *= 0.25 if(reinf) tforce *= 0.25
if(health - tforce <= 7 && !reinf) if(health - tforce <= 7 && !reinf)
anchored = 0 anchored = 0
update_verbs()
update_nearby_icons() update_nearby_icons()
step(src, get_dir(AM, src)) step(src, get_dir(AM, src))
take_damage(tforce) take_damage(tforce)

View File

@@ -7,7 +7,6 @@
if(density) if(density)
can_open = WALL_OPENING can_open = WALL_OPENING
//flick("[material.icon_base]fwall_opening", src) //flick("[material.icon_base]fwall_opening", src)
sleep(15)
density = 0 density = 0
update_icon() update_icon()
set_light(0) set_light(0)
@@ -20,7 +19,6 @@
//flick("[material.icon_base]fwall_closing", src) //flick("[material.icon_base]fwall_closing", src)
density = 1 density = 1
update_icon() update_icon()
sleep(15)
set_light(1) set_light(1)
src.blocks_air = 1 src.blocks_air = 1
src.opacity = 1 src.opacity = 1

View File

@@ -27,6 +27,7 @@
src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))" src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
return return
suiciding = 1 suiciding = 1
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
var/obj/item/held_item = get_active_hand() var/obj/item/held_item = get_active_hand()
if(held_item) if(held_item)
var/damagetype = held_item.suicide_act(src) var/damagetype = held_item.suicide_act(src)

View File

@@ -392,7 +392,7 @@
if (ticker && ticker.current_state >= GAME_STATE_PLAYING) if (ticker && ticker.current_state >= GAME_STATE_PLAYING)
var/dat = "<html><head><title>Round Status</title></head><body><h1><B>Round Status</B></h1>" var/dat = "<html><head><title>Round Status</title></head><body><h1><B>Round Status</B></h1>"
dat += "Current Game Mode: <B>[ticker.mode.name]</B><BR>" dat += "Current Game Mode: <B>[ticker.mode.name]</B><BR>"
dat += "Round Duration: <B>[round_duration_as_text()]</B><BR>" dat += "Round Duration: <B>[roundduration2text()]</B><BR>"
dat += "<B>Emergency shuttle</B><BR>" dat += "<B>Emergency shuttle</B><BR>"
if (!emergency_shuttle.online()) if (!emergency_shuttle.online())
dat += "<a href='?src=\ref[src];call_shuttle=1'>Call Shuttle</a><br>" dat += "<a href='?src=\ref[src];call_shuttle=1'>Call Shuttle</a><br>"

View File

@@ -892,9 +892,9 @@
if (ticker && ticker.mode) if (ticker && ticker.mode)
return alert(usr, "The game has already started.", null, null, null, null) return alert(usr, "The game has already started.", null, null, null, null)
master_mode = href_list["c_mode2"] master_mode = href_list["c_mode2"]
log_admin("[key_name(usr)] set the mode as [master_mode].") log_admin("[key_name(usr)] set the mode as [config.mode_names[master_mode]].")
message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1) message_admins("\blue [key_name_admin(usr)] set the mode as [config.mode_names[master_mode]].", 1)
world << "\blue <b>The mode is now: [master_mode]</b>" world << "\blue <b>The mode is now: [config.mode_names[master_mode]]</b>"
Game() // updates the main game menu Game() // updates the main game menu
world.save_mode(master_mode) world.save_mode(master_mode)
.(href, list("c_mode"=1)) .(href, list("c_mode"=1))

View File

@@ -137,6 +137,7 @@
prefs.last_id = computer_id //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning
. = ..() //calls mob.Login() . = ..() //calls mob.Login()
prefs.sanitize_preferences()
if(custom_event_msg && custom_event_msg != "") if(custom_event_msg && custom_event_msg != "")
src << "<h1 class='alert'>Custom Event</h1>" src << "<h1 class='alert'>Custom Event</h1>"

View File

@@ -52,34 +52,38 @@ var/list/gear_datums = list()
S["gear"] << pref.gear S["gear"] << pref.gear
/datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost) /datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost)
var/list/valid_gear_choices = list() . = list()
var/mob/preference_mob = preference_mob()
for(var/gear_name in gear_datums) for(var/gear_name in gear_datums)
var/datum/gear/G = gear_datums[gear_name] var/datum/gear/G = gear_datums[gear_name]
if(G.whitelisted && !is_alien_whitelisted(preference_mob(), all_species[G.whitelisted]))
if(G.whitelisted && !is_alien_whitelisted(preference_mob, all_species[G.whitelisted]))
continue continue
if(max_cost && G.cost > max_cost) if(max_cost && G.cost > max_cost)
continue continue
valid_gear_choices += gear_name . += gear_name
return valid_gear_choices
/datum/category_item/player_setup_item/loadout/sanitize_character() /datum/category_item/player_setup_item/loadout/sanitize_character()
var/mob/preference_mob = preference_mob()
if(!islist(pref.gear)) if(!islist(pref.gear))
pref.gear = list() pref.gear = list()
for(var/gear_name in pref.gear) for(var/gear_name in pref.gear)
if(!(gear_name in gear_datums)) if(!(gear_name in gear_datums))
pref.gear -= gear_name pref.gear -= gear_name
var/total_cost = 0 var/total_cost = 0
for(var/gear_name in pref.gear) for(var/gear_name in pref.gear)
if(!gear_datums[gear_name]) if(!gear_datums[gear_name])
preference_mob << "<span class='warning'>You cannot have more than one of the \the [gear_name]</span>"
pref.gear -= gear_name pref.gear -= gear_name
else if(!(gear_name in valid_gear_choices())) else if(!(gear_name in valid_gear_choices()))
preference_mob << "<span class='warning'>You cannot take \the [gear_name] as you are not whitelisted for the species.</span>"
pref.gear -= gear_name pref.gear -= gear_name
else else
var/datum/gear/G = gear_datums[gear_name] var/datum/gear/G = gear_datums[gear_name]
if(total_cost + G.cost > MAX_GEAR_COST) if(total_cost + G.cost > MAX_GEAR_COST)
pref.gear -= gear_name pref.gear -= gear_name
preference_mob << "<span class='warning'>You cannot afford to take \the [gear_name]</span>"
else else
total_cost += G.cost total_cost += G.cost

View File

@@ -180,6 +180,31 @@
path = /obj/item/clothing/suit/wcoat path = /obj/item/clothing/suit/wcoat
cost = 1 cost = 1
/datum/gear/suit/wcoat/red
display_name = "red waistcoat"
path = /obj/item/clothing/suit/wcoat/red
/datum/gear/suit/wcoat/grey
display_name = "grey waistcoat"
path = /obj/item/clothing/suit/wcoat/grey
/datum/gear/suit/wcoat/brown
display_name = "brown waistcoat"
path = /obj/item/clothing/suit/wcoat/brown
/datum/gear/suit/swvest
display_name = "black sweatervest"
path = /obj/item/clothing/suit/wcoat/swvest
cost = 1
/datum/gear/suit/swvest/blue
display_name = "blue sweatervest"
path = /obj/item/clothing/suit/wcoat/swvest/blue
/datum/gear/suit/swvest/red
display_name = "red sweatervest"
path = /obj/item/clothing/suit/wcoat/swvest/red
/datum/gear/suit/forensics /datum/gear/suit/forensics
display_name = "forensics long, red" display_name = "forensics long, red"
path = /obj/item/clothing/suit/storage/forensics/red/long path = /obj/item/clothing/suit/storage/forensics/red/long

View File

@@ -2,14 +2,12 @@
/datum/gear/suit/zhan_furs /datum/gear/suit/zhan_furs
display_name = "Zhan-Khazan furs (Tajara)" display_name = "Zhan-Khazan furs (Tajara)"
path = /obj/item/clothing/suit/tajaran/furs path = /obj/item/clothing/suit/tajaran/furs
whitelisted = "Tajara"
sort_category = "Xenowear" sort_category = "Xenowear"
/datum/gear/suit/unathi_mantle /datum/gear/suit/unathi_mantle
display_name = "hide mantle (Unathi)" display_name = "hide mantle (Unathi)"
path = /obj/item/clothing/suit/unathi/mantle path = /obj/item/clothing/suit/unathi/mantle
cost = 1 cost = 1
whitelisted = "Unathi"
sort_category = "Xenowear" sort_category = "Xenowear"
/datum/gear/ears/skrell/chains //Chains /datum/gear/ears/skrell/chains //Chains

View File

@@ -129,8 +129,6 @@
// Need due to, for example, the 01_basic module relying on species having been loaded to sanitize correctly but that isn't loaded until module 03_body. // Need due to, for example, the 01_basic module relying on species having been loaded to sanitize correctly but that isn't loaded until module 03_body.
for(var/datum/category_item/player_setup_item/PI in items) for(var/datum/category_item/player_setup_item/PI in items)
PI.load_character(S) PI.load_character(S)
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_character()
/datum/category_group/player_setup_category/proc/save_character(var/savefile/S) /datum/category_group/player_setup_category/proc/save_character(var/savefile/S)
// Sanitize all data, then save it // Sanitize all data, then save it
@@ -142,8 +140,6 @@
/datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S) /datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S)
for(var/datum/category_item/player_setup_item/PI in items) for(var/datum/category_item/player_setup_item/PI in items)
PI.load_preferences(S) PI.load_preferences(S)
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_preferences()
/datum/category_group/player_setup_category/proc/save_preferences(var/savefile/S) /datum/category_group/player_setup_category/proc/save_preferences(var/savefile/S)
for(var/datum/category_item/player_setup_item/PI in items) for(var/datum/category_item/player_setup_item/PI in items)

View File

@@ -237,12 +237,14 @@ datum/preferences
else if(href_list["reload"]) else if(href_list["reload"])
load_preferences() load_preferences()
load_character() load_character()
sanitize_preferences()
else if(href_list["load"]) else if(href_list["load"])
if(!IsGuestKey(usr.key)) if(!IsGuestKey(usr.key))
open_load_dialog(usr) open_load_dialog(usr)
return 1 return 1
else if(href_list["changeslot"]) else if(href_list["changeslot"])
load_character(text2num(href_list["changeslot"])) load_character(text2num(href_list["changeslot"]))
sanitize_preferences()
close_load_dialog(usr) close_load_dialog(usr)
else else
return 0 return 0

View File

@@ -32,7 +32,8 @@
/obj/item/clothing/head/chaplain_hood /obj/item/clothing/head/chaplain_hood
name = "chaplain's hood" name = "chaplain's hood"
desc = "It's hood that covers the head. It keeps you warm during the space winters." desc = "It's hood that covers the head. It keeps you warm during the space winters."
icon_state = "beret_black" icon_state = "chaplain_hood"
item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black")
flags_inv = BLOCKHAIR flags_inv = BLOCKHAIR
body_parts_covered = HEAD body_parts_covered = HEAD

View File

@@ -5,6 +5,11 @@
siemens_coefficient = 0.9 siemens_coefficient = 0.9
body_parts_covered = 0 body_parts_covered = 0
/obj/item/clothing/head/centhat/customs
name = "Customs Hat"
desc = "A formal hat for SolGov Customs Officers."
icon_state = "customshat"
/obj/item/clothing/head/hairflower /obj/item/clothing/head/hairflower
name = "hair flower pin" name = "hair flower pin"
icon_state = "hairflower" icon_state = "hairflower"
@@ -73,7 +78,7 @@
/obj/item/clothing/head/nursehat /obj/item/clothing/head/nursehat
name = "nurse's hat" name = "nurse's hat"
desc = "It allows quick identification of trained medical personnel." desc = "It allows quick identification of trained medical personnel."
item_state_slots = list(slot_r_hand_str = "nursehat", slot_l_hand_str = "nursehat") icon_state = "nursehat"
siemens_coefficient = 0.9 siemens_coefficient = 0.9
body_parts_covered = 0 body_parts_covered = 0

View File

@@ -168,7 +168,7 @@
helm_type = /obj/item/clothing/head/helmet/space/rig/ert helm_type = /obj/item/clothing/head/helmet/space/rig/ert
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
req_access = list() req_access = list()
req_one_access = list() req_one_access = list()

View File

@@ -92,6 +92,31 @@
blood_overlay_type = "armor" blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/suit/wcoat/red
name = "red waistcoat"
icon_state = "red_waistcoat"
/obj/item/clothing/suit/wcoat/grey
name = "grey waistcoat"
icon_state = "grey_waistcoat"
/obj/item/clothing/suit/wcoat/brown
name = "brown waistcoat"
icon_state = "brown_waistcoat"
/obj/item/clothing/suit/wcoat/swvest
name = "black sweatervest"
desc = "A sleeveless sweater. Wear this if you don't want your arms to be warm, or if you're a nerd."
icon_state = "sweatervest"
/obj/item/clothing/suit/wcoat/swvest/blue
name = "blue sweatervest"
icon_state = "sweatervest_blue"
/obj/item/clothing/suit/wcoat/swvest/red
name = "red sweatervest"
icon_state = "sweatervest_red"
/obj/item/clothing/suit/apron/overalls /obj/item/clothing/suit/apron/overalls
name = "coveralls" name = "coveralls"
desc = "A set of denim overalls." desc = "A set of denim overalls."
@@ -198,6 +223,12 @@
icon_state = "neocoat" icon_state = "neocoat"
item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket")
/obj/item/clothing/suit/customs
name = "customs jacket"
desc = "A standard SolGov Customs formal jacket."
icon_state = "customs_jacket"
item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue")
/* /*
* stripper * stripper
*/ */

View File

@@ -33,6 +33,14 @@
icon_state = "waiter" icon_state = "waiter"
rolled_sleeves = 0 rolled_sleeves = 0
/obj/item/clothing/under/customs
name = "customs uniform"
desc = "A standard SolGov customs uniform. Complete with epaulettes."
icon_state = "cu_suit"
/obj/item/clothing/under/customs/khaki
icon_state = "cu_suit_kh"
/obj/item/clothing/under/rank/mailman /obj/item/clothing/under/rank/mailman
name = "mailman's jumpsuit" name = "mailman's jumpsuit"
desc = "<i>'Special delivery!'</i>" desc = "<i>'Special delivery!'</i>"

View File

@@ -132,7 +132,7 @@ log transactions
T.amount = I:worth T.amount = I:worth
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
authenticated_account.transaction_log.Add(T) authenticated_account.transaction_log.Add(T)
user << "<span class='info'>You insert [I] into [src].</span>" user << "<span class='info'>You insert [I] into [src].</span>"
@@ -307,7 +307,7 @@ log transactions
T.purpose = transfer_purpose T.purpose = transfer_purpose
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
T.amount = "([transfer_amount])" T.amount = "([transfer_amount])"
authenticated_account.transaction_log.Add(T) authenticated_account.transaction_log.Add(T)
else else
@@ -343,7 +343,7 @@ log transactions
T.purpose = "Unauthorised login attempt" T.purpose = "Unauthorised login attempt"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
failed_account.transaction_log.Add(T) failed_account.transaction_log.Add(T)
else else
usr << "\icon[src]<span class='warning'>Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.</span>" usr << "\icon[src]<span class='warning'>Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.</span>"
@@ -363,7 +363,7 @@ log transactions
T.purpose = "Remote terminal access" T.purpose = "Remote terminal access"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
authenticated_account.transaction_log.Add(T) authenticated_account.transaction_log.Add(T)
usr << "\icon[src]<span class='info'>Access granted. Welcome user '[authenticated_account.owner_name].'</span>" usr << "\icon[src]<span class='info'>Access granted. Welcome user '[authenticated_account.owner_name].'</span>"
@@ -395,7 +395,7 @@ log transactions
T.amount = "([amount])" T.amount = "([amount])"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
authenticated_account.transaction_log.Add(T) authenticated_account.transaction_log.Add(T)
else else
usr << "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>" usr << "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>"
@@ -422,7 +422,7 @@ log transactions
T.amount = "([amount])" T.amount = "([amount])"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
authenticated_account.transaction_log.Add(T) authenticated_account.transaction_log.Add(T)
else else
usr << "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>" usr << "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>"
@@ -478,7 +478,7 @@ log transactions
T.purpose = "Remote terminal access" T.purpose = "Remote terminal access"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
authenticated_account.transaction_log.Add(T) authenticated_account.transaction_log.Add(T)
view_screen = 0 view_screen = 0

View File

@@ -40,7 +40,7 @@
M.account_number = rand(111111, 999999) M.account_number = rand(111111, 999999)
else else
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
T.source_terminal = source_db.machine_id T.source_terminal = source_db.machine_id
M.account_number = next_account_number M.account_number = next_account_number
@@ -57,7 +57,7 @@
R.info += "<i>Account number:</i> [M.account_number]<br>" R.info += "<i>Account number:</i> [M.account_number]<br>"
R.info += "<i>Account pin:</i> [M.remote_access_pin]<br>" R.info += "<i>Account pin:</i> [M.remote_access_pin]<br>"
R.info += "<i>Starting balance:</i> $[M.money]<br>" R.info += "<i>Starting balance:</i> $[M.money]<br>"
R.info += "<i>Date and time:</i> [worldtime2text()], [current_date_string]<br><br>" R.info += "<i>Date and time:</i> [stationtime2text()], [current_date_string]<br><br>"
R.info += "<i>Creation terminal ID:</i> [source_db.machine_id]<br>" R.info += "<i>Creation terminal ID:</i> [source_db.machine_id]<br>"
R.info += "<i>Authorised NT officer overseeing creation:</i> [source_db.held_card.registered_name]<br>" R.info += "<i>Authorised NT officer overseeing creation:</i> [source_db.held_card.registered_name]<br>"
@@ -90,7 +90,7 @@
else else
T.amount = "[amount]" T.amount = "[amount]"
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
T.source_terminal = terminal_id T.source_terminal = terminal_id
D.transaction_log.Add(T) D.transaction_log.Add(T)

View File

@@ -28,7 +28,7 @@
T.purpose = reason T.purpose = reason
T.amount = amount T.amount = amount
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
T.source_terminal = machine_id T.source_terminal = machine_id
return T return T

View File

@@ -140,7 +140,7 @@
T.amount = transaction_amount T.amount = transaction_amount
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
linked_account.transaction_log.Add(T) linked_account.transaction_log.Add(T)
else else
usr << "\icon[src]<span class='warning'>\The [O] doesn't have that much money!</span>" usr << "\icon[src]<span class='warning'>\The [O] doesn't have that much money!</span>"
@@ -264,7 +264,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
D.transaction_log.Add(T) D.transaction_log.Add(T)
// //
T = new() T = new()
@@ -273,7 +273,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
linked_account.transaction_log.Add(T) linked_account.transaction_log.Add(T)
else else
usr << "\icon[src]<span class='warning'>You don't have that much money!</span>" usr << "\icon[src]<span class='warning'>You don't have that much money!</span>"

View File

@@ -256,7 +256,7 @@
T.amount = "([transaction_amount])" T.amount = "([transaction_amount])"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
D.transaction_log.Add(T) D.transaction_log.Add(T)
// Create log entry in owner's account // Create log entry in owner's account
@@ -266,7 +266,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
linked_account.transaction_log.Add(T) linked_account.transaction_log.Add(T)
// Save log // Save log
@@ -304,7 +304,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
linked_account.transaction_log.Add(T) linked_account.transaction_log.Add(T)
// Save log // Save log
@@ -414,7 +414,7 @@
<tr></tr> <tr></tr>
<tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr> <tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr>
<tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr> <tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr>
<tr><td class="tx-name">Station Time</td><td class="tx-data">[worldtime2text()]</td></tr> <tr><td class="tx-name">Station Time</td><td class="tx-data">[stationtime2text()]</td></tr>
</table> </table>
<table width=300> <table width=300>
"} "}

View File

@@ -231,7 +231,7 @@
T.amount = "([transaction_amount])" T.amount = "([transaction_amount])"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
D.transaction_log.Add(T) D.transaction_log.Add(T)
// Create log entry in owner's account // Create log entry in owner's account
@@ -241,7 +241,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
linked_account.transaction_log.Add(T) linked_account.transaction_log.Add(T)
// Save log // Save log
@@ -274,7 +274,7 @@
T.amount = "[transaction_amount]" T.amount = "[transaction_amount]"
T.source_terminal = machine_id T.source_terminal = machine_id
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
linked_account.transaction_log.Add(T) linked_account.transaction_log.Add(T)
// Save log // Save log
@@ -348,7 +348,7 @@
<tr></tr> <tr></tr>
<tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr> <tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr>
<tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr> <tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr>
<tr><td class="tx-name">Station Time</td><td class="tx-data">[worldtime2text()]</td></tr> <tr><td class="tx-name">Station Time</td><td class="tx-data">[stationtime2text()]</td></tr>
</table> </table>
<table width=300> <table width=300>
"} "}

View File

@@ -44,7 +44,7 @@
if(EM.add_to_queue) if(EM.add_to_queue)
EC.available_events += EM EC.available_events += EM
log_debug("Event '[EM.name]' has completed at [worldtime2text()].") log_debug("Event '[EM.name]' has completed at [worldtime2stationtime(world.time)].")
/datum/event_manager/proc/delay_events(var/severity, var/delay) /datum/event_manager/proc/delay_events(var/severity, var/delay)
var/list/datum/event_container/EC = event_containers[severity] var/list/datum/event_container/EC = event_containers[severity]
@@ -67,12 +67,12 @@
var/datum/event_meta/EM = E.event_meta var/datum/event_meta/EM = E.event_meta
if(EM.name == "Nothing") if(EM.name == "Nothing")
continue continue
var/message = "'[EM.name]' began at [worldtime2text(E.startedAt)] " var/message = "'[EM.name]' began at [worldtime2stationtime(E.startedAt)] "
if(E.isRunning) if(E.isRunning)
message += "and is still running." message += "and is still running."
else else
if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes
message += "and ended at [worldtime2text(E.endedAt)]." message += "and ended at [worldtime2stationtime(E.endedAt)]."
else else
message += "and ran to completion." message += "and ran to completion."
@@ -130,7 +130,7 @@
var/next_event_at = max(0, EC.next_event_time - world.time) var/next_event_at = max(0, EC.next_event_time - world.time)
html += "<tr>" html += "<tr>"
html += "<td>[severity_to_string[severity]]</td>" html += "<td>[severity_to_string[severity]]</td>"
html += "<td>[worldtime2text(max(EC.next_event_time, world.time))]</td>" html += "<td>[worldtime2stationtime(max(EC.next_event_time, world.time))]</td>"
html += "<td>[round(next_event_at / 600, 0.1)]</td>" html += "<td>[round(next_event_at / 600, 0.1)]</td>"
html += "<td>" html += "<td>"
html += "<A align='right' href='?src=\ref[src];dec_timer=2;event=\ref[EC]'>--</A>" html += "<A align='right' href='?src=\ref[src];dec_timer=2;event=\ref[EC]'>--</A>"
@@ -178,7 +178,7 @@
html += "<tr>" html += "<tr>"
html += "<td>[severity_to_string[EM.severity]]</td>" html += "<td>[severity_to_string[EM.severity]]</td>"
html += "<td>[EM.name]</td>" html += "<td>[EM.name]</td>"
html += "<td>[worldtime2text(ends_at)]</td>" html += "<td>[worldtime2stationtime(ends_at)]</td>"
html += "<td>[ends_in]</td>" html += "<td>[ends_in]</td>"
html += "<td><A align='right' href='?src=\ref[src];stop=\ref[E]'>Stop</A></td>" html += "<td><A align='right' href='?src=\ref[src];stop=\ref[E]'>Stop</A></td>"
html += "</tr>" html += "</tr>"

View File

@@ -15,7 +15,7 @@
kill() kill()
/datum/event/money_hacker/announce() /datum/event/money_hacker/announce()
var/message = "A brute force hack has been detected (in progress since [worldtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \ var/message = "A brute force hack has been detected (in progress since [stationtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \
without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \ without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \
Notifications will be sent as updates occur.<br>" Notifications will be sent as updates occur.<br>"
var/my_department = "[station_name()] firewall subroutines" var/my_department = "[station_name()] firewall subroutines"
@@ -51,7 +51,7 @@
T.date = pick("", current_date_string, date1, date2) T.date = pick("", current_date_string, date1, date2)
var/time1 = rand(0, 99999999) var/time1 = rand(0, 99999999)
var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]"
T.time = pick("", worldtime2text(), time2) T.time = pick("", stationtime2text(), time2)
T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD") T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD")
affected_account.transaction_log.Add(T) affected_account.transaction_log.Add(T)

View File

@@ -16,7 +16,7 @@
T.purpose = "Winner!" T.purpose = "Winner!"
T.amount = winner_sum T.amount = winner_sum
T.date = current_date_string T.date = current_date_string
T.time = worldtime2text() T.time = stationtime2text()
T.source_terminal = "Sif TCD Terminal #[rand(111,333)]" T.source_terminal = "Sif TCD Terminal #[rand(111,333)]"
D.transaction_log.Add(T) D.transaction_log.Add(T)

View File

@@ -47,7 +47,7 @@
if(areas && areas.len > 0) if(areas && areas.len > 0)
var/my_department = "[station_name()] firewall subroutines" var/my_department = "[station_name()] firewall subroutines"
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [worldtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.<br>" var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [stationtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.<br>"
for(var/obj/machinery/message_server/MS in world) for(var/obj/machinery/message_server/MS in world)
MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2) MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2)
for(var/mob/living/silicon/ai/A in player_list) for(var/mob/living/silicon/ai/A in player_list)

View File

@@ -395,7 +395,7 @@ var/list/name_to_material
weight = 15 weight = 15
door_icon_base = "stone" door_icon_base = "stone"
destruction_desc = "shatters" destruction_desc = "shatters"
window_options = list("One Direction" = 1, "Full Window" = 4) window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2)
created_window = /obj/structure/window/basic created_window = /obj/structure/window/basic
rod_product = /obj/item/stack/material/glass/reinforced rod_product = /obj/item/stack/material/glass/reinforced
@@ -425,6 +425,12 @@ var/list/name_to_material
for (var/obj/structure/window/check_window in user.loc) for (var/obj/structure/window/check_window in user.loc)
window_count++ window_count++
possible_directions -= check_window.dir possible_directions -= check_window.dir
for (var/obj/structure/windoor_assembly/check_assembly in user.loc)
window_count++
possible_directions -= check_assembly.dir
for (var/obj/machinery/door/window/check_windoor in user.loc)
window_count++
possible_directions -= check_windoor.dir
// Get the closest available dir to the user's current facing. // Get the closest available dir to the user's current facing.
var/build_dir = SOUTHWEST //Default to southwest for fulltile windows. var/build_dir = SOUTHWEST //Default to southwest for fulltile windows.
@@ -435,18 +441,12 @@ var/list/name_to_material
else else
if(choice in list("One Direction","Windoor")) if(choice in list("One Direction","Windoor"))
if(possible_directions.len) if(possible_directions.len)
for(var/direction in list(user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) )) for(var/direction in list(user.dir, turn(user.dir,90), turn(user.dir,270), turn(user.dir,180)))
if(direction in possible_directions) if(direction in possible_directions)
build_dir = direction build_dir = direction
break break
else else
failed_to_build = 1 failed_to_build = 1
if(!failed_to_build && choice == "Windoor")
if(!is_reinforced())
user << "<span class='warning'>This material is not reinforced enough to use for a door.</span>"
return
if((locate(/obj/structure/windoor_assembly) in T.contents) || (locate(/obj/machinery/door/window) in T.contents))
failed_to_build = 1
if(failed_to_build) if(failed_to_build)
user << "<span class='warning'>There is no room in this location.</span>" user << "<span class='warning'>There is no room in this location.</span>"
return 1 return 1
@@ -454,7 +454,8 @@ var/list/name_to_material
var/build_path = /obj/structure/windoor_assembly var/build_path = /obj/structure/windoor_assembly
var/sheets_needed = window_options[choice] var/sheets_needed = window_options[choice]
if(choice == "Windoor") if(choice == "Windoor")
build_dir = user.dir if(is_reinforced())
build_path = /obj/structure/windoor_assembly/secure
else else
build_path = created_window build_path = created_window
@@ -484,7 +485,7 @@ var/list/name_to_material
weight = 30 weight = 30
stack_origin_tech = "materials=2" stack_origin_tech = "materials=2"
composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 2, "glass" = SHEET_MATERIAL_AMOUNT) composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 2, "glass" = SHEET_MATERIAL_AMOUNT)
window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 5) window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2)
created_window = /obj/structure/window/reinforced created_window = /obj/structure/window/reinforced
wire_product = null wire_product = null
rod_product = null rod_product = null
@@ -497,6 +498,7 @@ var/list/name_to_material
integrity = 100 integrity = 100
icon_colour = "#FC2BC5" icon_colour = "#FC2BC5"
stack_origin_tech = list(TECH_MATERIAL = 4) stack_origin_tech = list(TECH_MATERIAL = 4)
window_options = list("One Direction" = 1, "Full Window" = 4)
created_window = /obj/structure/window/phoronbasic created_window = /obj/structure/window/phoronbasic
wire_product = null wire_product = null
rod_product = /obj/item/stack/material/glass/phoronrglass rod_product = /obj/item/stack/material/glass/phoronrglass
@@ -507,6 +509,7 @@ var/list/name_to_material
stack_type = /obj/item/stack/material/glass/phoronrglass stack_type = /obj/item/stack/material/glass/phoronrglass
stack_origin_tech = list(TECH_MATERIAL = 5) stack_origin_tech = list(TECH_MATERIAL = 5)
composite_material = list() //todo composite_material = list() //todo
window_options = list("One Direction" = 1, "Full Window" = 4)
created_window = /obj/structure/window/phoronreinforced created_window = /obj/structure/window/phoronreinforced
hardness = 40 hardness = 40
weight = 30 weight = 30

View File

@@ -57,7 +57,7 @@
var/drill_verb = "drilling" var/drill_verb = "drilling"
sharp = 1 sharp = 1
var/excavation_amount = 100 var/excavation_amount = 200
/obj/item/weapon/pickaxe/hammer /obj/item/weapon/pickaxe/hammer
name = "sledgehammer" name = "sledgehammer"

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