Coonflict fiiixeeess
This commit is contained in:
@@ -63,6 +63,7 @@
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=delayed_onlyone'>There can only be one! (40-second delay)</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=stupify'>Make all players stupid</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=eagles'>Egalitarian Station Mode</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=ancap'>Anarcho-Capitalist Station Mode</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=blackout'>Break all lights</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=whiteout'>Fix all lights</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=floorlava'>The floor is lava! (DANGEROUS: extremely lame)</A><BR>
|
||||
@@ -478,6 +479,17 @@
|
||||
usr.client.ak47s()
|
||||
sound_to_playing_players('sound/misc/ak47s.ogg')
|
||||
|
||||
if("ancap")
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Anarcho-capitalist Station"))
|
||||
SSeconomy.full_ancap = !SSeconomy.full_ancap
|
||||
message_admins("[key_name_admin(usr)] toggled Anarcho-capitalist mode")
|
||||
if(SSeconomy.full_ancap)
|
||||
priority_announce("The NAP is now in full effect.", null, "commandreport")
|
||||
else
|
||||
priority_announce("The NAP has been revoked.", null, "commandreport")
|
||||
|
||||
if("guns")
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
var/mach = 0
|
||||
|
||||
/datum/station_state/proc/count()
|
||||
floor = 0
|
||||
wall = 0
|
||||
r_wall = 0
|
||||
window = 0
|
||||
door = 0
|
||||
grille = 0
|
||||
mach = 0
|
||||
for(var/Z in SSmapping.levels_by_trait(ZTRAIT_STATION))
|
||||
for(var/turf/T in block(locate(1,1,Z), locate(world.maxx,world.maxy,Z)))
|
||||
// don't count shuttles since they may have just left
|
||||
@@ -48,6 +55,10 @@
|
||||
else if(ismachinery(O))
|
||||
mach += 1
|
||||
|
||||
CHECK_TICK
|
||||
CHECK_TICK
|
||||
CHECK_TICK
|
||||
|
||||
/datum/station_state/proc/score(datum/station_state/result)
|
||||
if(!result)
|
||||
return 0
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2)
|
||||
owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD))
|
||||
// Nutrition
|
||||
owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are.
|
||||
owner.current.set_nutrition(min(owner.current.blood_volume, NUTRITION_LEVEL_FULL)) //The amount of blood is how full we are.
|
||||
//A bit higher regeneration based on blood volume
|
||||
if(owner.current.blood_volume < 700)
|
||||
additional_regen = 0.4
|
||||
@@ -331,7 +331,7 @@
|
||||
return
|
||||
var/mob/living/carbon/C = owner.current
|
||||
// Remove Nutrition, Give Bad Food
|
||||
C.nutrition -= food_nutrition
|
||||
C.adjust_nutrition(-food_nutrition)
|
||||
foodInGut += food_nutrition
|
||||
// Already ate some bad clams? Then we can back out, because we're already sick from it.
|
||||
if(foodInGut != food_nutrition)
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
changeling.trueabsorbs++
|
||||
|
||||
if(user.nutrition < NUTRITION_LEVEL_WELL_FED)
|
||||
user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED)
|
||||
user.adjust_nutrition(target.nutrition, NUTRITION_LEVEL_WELL_FED)
|
||||
|
||||
// Absorb a lizard, speak Draconic.
|
||||
user.copy_languages(target, LANGUAGE_ABSORB)
|
||||
|
||||
@@ -183,7 +183,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
if(soulsOwned.Find(soul))
|
||||
return
|
||||
soulsOwned += soul
|
||||
owner.current.nutrition = NUTRITION_LEVEL_FULL
|
||||
owner.current.set_nutrition(NUTRITION_LEVEL_FULL)
|
||||
to_chat(owner.current, "<span class='warning'>You feel satiated as you received a new soul.</span>")
|
||||
update_hud()
|
||||
switch(SOULVALUE)
|
||||
|
||||
@@ -118,30 +118,33 @@
|
||||
|
||||
// After we remove items, at least give them what they need to live.
|
||||
target.dna.species.give_important_for_life(target)
|
||||
|
||||
// After pod is sent we start the victim narrative/heal.
|
||||
handleVictimExperience(M)
|
||||
|
||||
// This is slightly delayed because of the sleep calls above to handle the narrative.
|
||||
// We don't want to tell the station instantly.
|
||||
var/points_to_check
|
||||
if(points_to_check >= ransom)
|
||||
SSshuttle.points -= ransom
|
||||
else
|
||||
SSshuttle.points -= points_to_check
|
||||
|
||||
handleVictimExperience(M) // After pod is sent we start the victim narrative/heal.
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
var/points_to_check = min(D.account_balance, ransom)
|
||||
D.adjust_money(min(points_to_check, ransom))
|
||||
priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. \
|
||||
As is policy we've taken a portion of the station's funds to offset the overall cost.", null, "attention", null, "Nanotrasen Asset Protection")
|
||||
|
||||
// They're off to holding - handle the return timer and give some text about what's going on.
|
||||
/datum/syndicate_contract/proc/handleVictimExperience(var/mob/living/M)
|
||||
// Ship 'em back - dead or alive, 4 minutes wait.
|
||||
// Even if they weren't the target, we're still treating them the same.
|
||||
addtimer(CALLBACK(src, .proc/returnVictim, M), (60 * 10) * 4)
|
||||
sleep(30)
|
||||
|
||||
if (M.stat != DEAD)
|
||||
M.reagents.add_reagent(/datum/reagent/medicine/regen_jelly, 20)
|
||||
// Pay contractor their portion of ransom
|
||||
if (status == CONTRACT_STATUS_COMPLETE)
|
||||
var/mob/living/carbon/human/H
|
||||
var/obj/item/card/id/C
|
||||
if(ishuman(contract.owner.current))
|
||||
H = contract.owner.current
|
||||
C = H.get_idcard(TRUE)
|
||||
|
||||
if(C && C.registered_account)
|
||||
C.registered_account.adjust_money(points_to_check * 0.35)
|
||||
|
||||
C.registered_account.bank_card_talk("We've processed the ransom, agent. Here's your cut - your balance is now \
|
||||
[C.registered_account.account_balance] cr.", TRUE)
|
||||
|
||||
/datum/syndicate_contract/proc/handleVictimExperience(var/mob/living/M) // They're off to holding - handle the return timer and give some text about what's going on.
|
||||
addtimer(CALLBACK(src, .proc/returnVictim, M), 4 MINUTES) // Ship 'em back - dead or alive... 4 minutes wait.
|
||||
if(M.stat != DEAD) //Even if they weren't the target, we're still treating them the same.
|
||||
M.reagents.add_reagent(/datum/reagent/medicine/regen_jelly, 20) // Heal them up - gets them out of crit/soft crit. -- now 100% toxinlover friendly!!
|
||||
M.flash_act()
|
||||
M.confused += 10
|
||||
M.blur_eyes(5)
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
/obj/item/electronics/airalarm
|
||||
name = "air alarm electronics"
|
||||
icon_state = "airalarm_electronics"
|
||||
custom_price = 50
|
||||
|
||||
/obj/item/wallframe/airalarm
|
||||
name = "air alarm frame"
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
var/message_cooldown
|
||||
var/breakout_time = 300
|
||||
|
||||
fair_market_price = 10
|
||||
payment_department = ACCOUNT_MED
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
|
||||
. = ..()
|
||||
initialize_directions = dir
|
||||
@@ -149,6 +152,9 @@
|
||||
add_overlay("cover-on")
|
||||
addtimer(CALLBACK(src, .proc/run_anim, anim_up, occupant_overlay), 7, TIMER_UNIQUE)
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator)
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/cryo_cell/process()
|
||||
..()
|
||||
|
||||
@@ -162,7 +168,8 @@
|
||||
return
|
||||
|
||||
var/mob/living/mob_occupant = occupant
|
||||
|
||||
if(!check_nap_violations())
|
||||
return
|
||||
if(mob_occupant.stat == DEAD) // We don't bother with dead people.
|
||||
return
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
/datum/bounty/item/science/advanced_mop
|
||||
name = "Advanced Mop"
|
||||
description = "Excuse me. I'd like to request 17 credits for a push broom rebristling. Either that, or an advanced mop."
|
||||
description = "Excuse me. I'd like to request 17 cr for a push broom rebristling. Either that, or an advanced mop."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/mop/advanced)
|
||||
|
||||
|
||||
@@ -21,7 +21,9 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
// Called when the claim button is clicked. Override to provide fancy rewards.
|
||||
/datum/bounty/proc/claim()
|
||||
if(can_claim())
|
||||
SSshuttle.points += reward
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
D.adjust_money(reward)
|
||||
claimed = TRUE
|
||||
|
||||
// If an item sent in the cargo shuttle can satisfy the bounty.
|
||||
@@ -126,11 +128,11 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
/proc/setup_bounties()
|
||||
|
||||
var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes!
|
||||
|
||||
|
||||
/********************************Subtype Gens********************************/
|
||||
var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2,
|
||||
/datum/bounty/item/mech = 1,
|
||||
/datum/bounty/item/chef = 2,
|
||||
/datum/bounty/item/mech = 1,
|
||||
/datum/bounty/item/chef = 2,
|
||||
/datum/bounty/item/security = 1,
|
||||
/datum/bounty/virus = 1,
|
||||
/datum/bounty/item/engineering = 1,
|
||||
@@ -139,30 +141,30 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
/datum/bounty/item/botany = 2,
|
||||
/datum/bounty/item/silly = 1,
|
||||
/datum/bounty/item/gardencook = 1)
|
||||
|
||||
|
||||
for(var/the_type in easy_add_list_subtypes)
|
||||
for(var/i in 1 to easy_add_list_subtypes[the_type])
|
||||
pick = pick(subtypesof(the_type))
|
||||
try_add_bounty(new pick)
|
||||
|
||||
|
||||
/********************************Strict Type Gens********************************/
|
||||
var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1,
|
||||
/datum/bounty/reagent/complex_drink = 1,
|
||||
/datum/bounty/reagent/chemical = 1)
|
||||
|
||||
|
||||
for(var/the_strict_type in easy_add_list_strict_types)
|
||||
for(var/i in 1 to easy_add_list_strict_types[the_strict_type])
|
||||
try_add_bounty(new the_strict_type)
|
||||
|
||||
|
||||
/********************************Dynamic Gens********************************/
|
||||
|
||||
|
||||
for(var/i in 0 to 1)
|
||||
if(prob(50))
|
||||
pick = pick(subtypesof(/datum/bounty/item/slime))
|
||||
else
|
||||
pick = pick(subtypesof(/datum/bounty/item/science))
|
||||
try_add_bounty(new pick)
|
||||
|
||||
|
||||
/********************************Cutoff for Non-Low Priority Bounties********************************/
|
||||
var/datum/bounty/B = pick(GLOB.bounties_list)
|
||||
B.mark_high_priority()
|
||||
@@ -172,7 +174,7 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
/datum/bounty/item/syndicate_documents,
|
||||
/datum/bounty/item/adamantine,
|
||||
/datum/bounty/more_bounties)
|
||||
|
||||
|
||||
for(var/low_priority_bounty in low_priority_strict_type_list)
|
||||
try_add_bounty(new low_priority_bounty)
|
||||
|
||||
|
||||
@@ -35,10 +35,10 @@
|
||||
|
||||
if(!GLOB.bounties_list.len)
|
||||
setup_bounties()
|
||||
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
var/list/dat = list({"<a href='?src=[REF(src)];refresh=1'>Refresh</a>
|
||||
<a href='?src=[REF(src)];refresh=1;choice=Print'>Print Paper</a>
|
||||
<p>Credits: <b>[SSshuttle.points]</b></p>
|
||||
<p>Credits: <b>[D.account_balance]</b></p>
|
||||
<table style="text-align:center;" border="1" cellspacing="0" width="100%">
|
||||
<tr><th>Name</th><th>Description</th><th>Reward</th><th>Completion</th><th>Status</th></tr>"})
|
||||
for(var/datum/bounty/B in GLOB.bounties_list)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Used to order supplies, approve requests, and control the shuttle."
|
||||
icon_screen = "supply"
|
||||
circuit = /obj/item/circuitboard/computer/cargo
|
||||
req_access = list(ACCESS_CARGO)
|
||||
ui_x = 780
|
||||
ui_y = 750
|
||||
|
||||
@@ -25,6 +26,7 @@
|
||||
desc = "Used to request supplies from cargo."
|
||||
icon_screen = "request"
|
||||
circuit = /obj/item/circuitboard/computer/cargo/request
|
||||
req_access = list()
|
||||
requestonly = TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/Initialize()
|
||||
@@ -49,6 +51,7 @@
|
||||
. |= EXPORT_EMAG
|
||||
|
||||
/obj/machinery/computer/cargo/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(user)
|
||||
@@ -62,7 +65,9 @@
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.contraband = TRUE
|
||||
board.obj_flags |= EMAGGED
|
||||
req_access = list()
|
||||
update_static_data(user)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
@@ -74,9 +79,12 @@
|
||||
/obj/machinery/computer/cargo/ui_data()
|
||||
var/list/data = list()
|
||||
data["location"] = SSshuttle.supply.getStatusText()
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
data["points"] = D.account_balance
|
||||
data["away"] = SSshuttle.supply.getDockedId() == "supply_away"
|
||||
data["self_paid"] = self_paid
|
||||
data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE
|
||||
data["points"] = SSshuttle.points
|
||||
data["loan"] = !!SSshuttle.shuttle_loan
|
||||
data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched
|
||||
var/message = "Remember to stamp and send back the supply manifests."
|
||||
@@ -92,6 +100,7 @@
|
||||
"cost" = SO.pack.cost,
|
||||
"id" = SO.id,
|
||||
"orderer" = SO.orderer,
|
||||
"paid" = !isnull(SO.paying_account) //paid by requester
|
||||
))
|
||||
|
||||
data["requests"] = list()
|
||||
@@ -131,6 +140,9 @@
|
||||
/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
|
||||
if(..())
|
||||
return
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='notice'>Access denied.</span>")
|
||||
return
|
||||
switch(action)
|
||||
if("send")
|
||||
if(!SSshuttle.supply.canMove())
|
||||
@@ -182,19 +194,33 @@
|
||||
name = usr.real_name
|
||||
rank = "Silicon"
|
||||
|
||||
var/datum/bank_account/account
|
||||
if(self_paid && ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
var/obj/item/card/id/id_card = H.get_idcard(TRUE)
|
||||
if(!istype(id_card))
|
||||
say("No ID card detected.")
|
||||
return
|
||||
account = id_card.registered_account
|
||||
if(!istype(account))
|
||||
say("Invalid bank account.")
|
||||
return
|
||||
|
||||
var/reason = ""
|
||||
if(requestonly)
|
||||
if(requestonly && !self_paid)
|
||||
reason = stripped_input("Reason:", name, "")
|
||||
if(isnull(reason) || ..())
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
|
||||
SO.generateRequisition(T)
|
||||
if(requestonly)
|
||||
if(requestonly && !self_paid)
|
||||
SSshuttle.requestlist += SO
|
||||
else
|
||||
SSshuttle.shoppinglist += SO
|
||||
if(self_paid)
|
||||
say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.")
|
||||
. = TRUE
|
||||
if("remove")
|
||||
var/id = text2num(params["id"])
|
||||
@@ -224,6 +250,9 @@
|
||||
if("denyall")
|
||||
SSshuttle.requestlist.Cut()
|
||||
. = TRUE
|
||||
if("toggleprivate")
|
||||
self_paid = !self_paid
|
||||
. = TRUE
|
||||
if(.)
|
||||
post_signal("supply")
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
|
||||
var/list/total_value = list() //export instance => total value of sold objects
|
||||
var/list/reagents_volume = list()//export reagents => into the total volume of the object sold
|
||||
var/list/reagents_value = list()//export reagents => into the reagent type total value.
|
||||
var/list/exported_atoms_ref = list() //if they're not deleted they go in here for use.
|
||||
|
||||
// external_report works as "transaction" object, pass same one in if you're doing more than one export in single go
|
||||
/proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report)
|
||||
|
||||
@@ -98,17 +98,19 @@
|
||||
/obj/machinery/computer/cargo/express/ui_data(mob/user)
|
||||
var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
|
||||
var/list/data = list()
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
data["points"] = D.account_balance
|
||||
data["locked"] = locked//swipe an ID to unlock
|
||||
data["siliconUser"] = hasSiliconAccessInArea(user)
|
||||
data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
|
||||
data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay?
|
||||
data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
|
||||
data["canBuyBeacon"] = cooldown <= 0 && SSshuttle.points >= BEACON_COST
|
||||
data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST
|
||||
data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
|
||||
data["hasBeacon"] = beacon != null//is there a linked beacon?
|
||||
data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
|
||||
data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
|
||||
data["points"] = SSshuttle.points
|
||||
data["supplies"] = list()
|
||||
message = "Sales are near-instantaneous - please choose carefully."
|
||||
if(SSshuttle.supplyBlocked)
|
||||
@@ -129,6 +131,9 @@
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='notice'>Access denied.</span>")
|
||||
return
|
||||
switch(action)
|
||||
if("LZCargo")
|
||||
usingBeacon = FALSE
|
||||
@@ -139,13 +144,14 @@
|
||||
if (beacon)
|
||||
beacon.update_status(SP_READY) //turns on the beacon's ready light
|
||||
if("printBeacon")
|
||||
if (SSshuttle.points >= BEACON_COST)
|
||||
cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
|
||||
var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
|
||||
C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
|
||||
printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
|
||||
beacon.name = "Supply Pod Beacon #[printed_beacons]"
|
||||
SSshuttle.points -= BEACON_COST
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
if(D.adjust_money(-BEACON_COST))
|
||||
cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
|
||||
var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
|
||||
C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
|
||||
printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
|
||||
beacon.name = "Supply Pod Beacon #[printed_beacons]"
|
||||
|
||||
if("add")//Generate Supply Order first
|
||||
var/id = text2path(params["id"])
|
||||
@@ -165,8 +171,12 @@
|
||||
var/reason = ""
|
||||
var/list/empty_turfs
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
|
||||
var/points_to_check
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
points_to_check = D.account_balance
|
||||
if(!(obj_flags & EMAGGED))
|
||||
if(SO.pack.cost <= SSshuttle.points)
|
||||
if(SO.pack.cost <= points_to_check)
|
||||
var/LZ
|
||||
if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay
|
||||
LZ = get_turf(beacon)
|
||||
@@ -183,14 +193,14 @@
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
LZ = pick(empty_turfs)
|
||||
if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call
|
||||
SSshuttle.points -= SO.pack.cost
|
||||
if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call
|
||||
D.adjust_money(-SO.pack.cost)
|
||||
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
|
||||
new /obj/effect/abstract/DPtarget(LZ, podType, SO)
|
||||
. = TRUE
|
||||
update_icon()
|
||||
else
|
||||
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^)
|
||||
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^)
|
||||
landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone
|
||||
for(var/turf/open/floor/T in landingzone.contents)
|
||||
if(is_blocked_turf(T))
|
||||
@@ -198,7 +208,7 @@
|
||||
LAZYADD(empty_turfs, T)
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
SSshuttle.points -= SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)
|
||||
D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)))
|
||||
SSblackbox.record_feedback("nested tally", "cargo_imports", MAX_EMAG_ROCKETS, list("[SO.pack.cost * 0.72]", "[SO.pack.name]"))
|
||||
SO.generateRequisition(get_turf(src))
|
||||
for(var/i in 1 to MAX_EMAG_ROCKETS)
|
||||
|
||||
@@ -28,14 +28,16 @@
|
||||
var/orderer_ckey
|
||||
var/reason
|
||||
var/datum/supply_pack/pack
|
||||
var/datum/bank_account/paying_account
|
||||
|
||||
/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason)
|
||||
/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account)
|
||||
id = SSshuttle.ordernum++
|
||||
src.pack = pack
|
||||
src.orderer = orderer
|
||||
src.orderer_rank = orderer_rank
|
||||
src.orderer_ckey = orderer_ckey
|
||||
src.reason = reason
|
||||
src.paying_account = paying_account
|
||||
|
||||
/datum/supply_order/proc/generateRequisition(turf/T)
|
||||
var/obj/item/paper/P = new(T)
|
||||
@@ -47,6 +49,8 @@
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
P.info += "Access Restrictions: [get_access_desc(pack.access)]<br/>"
|
||||
P.info += "Requested by: [orderer]<br/>"
|
||||
if(paying_account)
|
||||
P.info += "Paid by: [paying_account.account_holder]<br/>"
|
||||
P.info += "Rank: [orderer_rank]<br/>"
|
||||
P.info += "Comment: [reason]<br/>"
|
||||
|
||||
@@ -61,6 +65,9 @@
|
||||
P.name = "shipping manifest - #[id] ([pack.name])"
|
||||
P.info += "<h2>[command_name()] Shipping Manifest</h2>"
|
||||
P.info += "<hr/>"
|
||||
if(paying_account)
|
||||
P.info += "Direct purchase from [paying_account.account_holder]<br/>"
|
||||
P.name += " - Purchased by [paying_account.account_holder]"
|
||||
P.info += "Order #[id]<br/>"
|
||||
P.info += "Destination: [station_name]<br/>"
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
@@ -81,7 +88,7 @@
|
||||
return P
|
||||
|
||||
/datum/supply_order/proc/generate(atom/A)
|
||||
var/obj/structure/closet/crate/C = pack.generate(A)
|
||||
var/obj/structure/closet/crate/C = pack.generate(A, paying_account)
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = generateManifest(C)
|
||||
|
||||
if(M.errors & MANIFEST_ERROR_ITEM)
|
||||
|
||||
@@ -16,16 +16,20 @@
|
||||
var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console
|
||||
var/admin_spawned = FALSE //Can only an admin spawn this crate?
|
||||
|
||||
/datum/supply_pack/proc/generate(atom/A)
|
||||
var/obj/structure/closet/crate/C = new crate_type(A)
|
||||
C.name = crate_name
|
||||
/datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account)
|
||||
var/obj/structure/closet/crate/C
|
||||
if(paying_account)
|
||||
C = new /obj/structure/closet/crate/secure/owned(A, paying_account)
|
||||
C.name = "[crate_name] - Purchased by [paying_account.account_holder]"
|
||||
else
|
||||
C = new crate_type(A)
|
||||
C.name = crate_name
|
||||
if(access)
|
||||
C.req_access = list(access)
|
||||
if(access_any)
|
||||
C.req_one_access = access_any
|
||||
|
||||
fill(C)
|
||||
|
||||
return C
|
||||
|
||||
/datum/supply_pack/proc/fill(obj/structure/closet/crate/C)
|
||||
|
||||
@@ -170,8 +170,7 @@
|
||||
cost = 7500
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/rationpack,
|
||||
/obj/item/ammo_box/a762,
|
||||
/obj/item/storage/toolbox/ammo,
|
||||
/obj/item/ammo_box/magazine/m10mm/rifle,
|
||||
/obj/item/clothing/suit/armor/vest/russian,
|
||||
/obj/item/clothing/head/helmet/rus_helmet,
|
||||
/obj/item/clothing/shoes/russian,
|
||||
@@ -181,7 +180,7 @@
|
||||
/obj/item/clothing/mask/russian_balaclava,
|
||||
/obj/item/clothing/head/helmet/rus_ushanka,
|
||||
/obj/item/clothing/suit/armor/vest/russian_coat,
|
||||
/obj/item/gun/ballistic/shotgun/boltaction)
|
||||
/obj/item/gun/ballistic/automatic/surplus)
|
||||
crate_name = "surplus military crate"
|
||||
|
||||
/datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C)
|
||||
|
||||
@@ -99,11 +99,11 @@
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/security/russianmosin
|
||||
name = "Russian Minutemen Gear"
|
||||
desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip."
|
||||
name = "Russian Partisan Gear"
|
||||
desc = "An old russian partisan equipment crate, comes with a full russian outfit, a loaded surplus rifle and a second magazine."
|
||||
contraband = TRUE
|
||||
access = FALSE
|
||||
cost = 6500 //
|
||||
cost = 6500
|
||||
contains = list(/obj/item/clothing/suit/armor/navyblue/russian,
|
||||
/obj/item/clothing/shoes/combat,
|
||||
/obj/item/clothing/head/ushanka,
|
||||
@@ -111,8 +111,8 @@
|
||||
/obj/item/clothing/head/helmet/alt,
|
||||
/obj/item/clothing/gloves/tackler/combat/insulated,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/gun/ballistic/shotgun/boltaction,
|
||||
/obj/item/ammo_box/a762)
|
||||
/obj/item/ammo_box/magazine/m10mm/rifle,
|
||||
/obj/item/gun/ballistic/automatic/surplus)
|
||||
crate_name = "surplus russian gear"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
|
||||
@@ -918,7 +918,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat += "<b>Ghosts of Others:</b> <a href='?_src_=prefs;task=input;preference=ghostothers'>[button_name]</a><br>"
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
|
||||
|
||||
dat += "<b>Income Updates:</b> <a href='?_src_=prefs;preference=income_pings'>[(chat_toggles & CHAT_BANKCARD) ? "Allowed" : "Muted"]</a><br>"
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<b>Parallax (Fancy Space):</b> <a href='?_src_=prefs;preference=parallaxdown' oncontextmenu='window.location.href=\"?_src_=prefs;preference=parallaxup\";return false;'>"
|
||||
switch (parallax)
|
||||
if (PARALLAX_LOW)
|
||||
@@ -1522,7 +1527,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["flavor_text"] = html_decode(msg)
|
||||
|
||||
if("ooc_notes")
|
||||
var/msg = stripped_multiline_input(usr, "Set always-visible OOC notes related to content preferences. THIS IS NOT FOR CHARACTE DESCRIPTIONS!!", "OOC notes", features["ooc_notes"], MAX_FLAVOR_LEN, TRUE)
|
||||
var/msg = stripped_multiline_input(usr, "Set always-visible OOC notes related to content preferences. THIS IS NOT FOR CHARACTER DESCRIPTIONS!", "OOC notes", features["ooc_notes"], MAX_FLAVOR_LEN, TRUE)
|
||||
if(!isnull(msg))
|
||||
features["ooc_notes"] = html_decode(msg)
|
||||
|
||||
@@ -2319,6 +2324,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("ghost_pda")
|
||||
chat_toggles ^= CHAT_GHOSTPDA
|
||||
|
||||
if("income_pings")
|
||||
chat_toggles ^= CHAT_BANKCARD
|
||||
|
||||
if("pull_requests")
|
||||
chat_toggles ^= CHAT_PULLR
|
||||
|
||||
|
||||
@@ -290,7 +290,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked))
|
||||
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
|
||||
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
|
||||
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
|
||||
toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles))
|
||||
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
|
||||
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
|
||||
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
|
||||
@@ -312,7 +312,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
|
||||
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
|
||||
autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
|
||||
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
|
||||
cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles))
|
||||
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
|
||||
no_tetris_storage = sanitize_integer(no_tetris_storage, 0, 1, initial(no_tetris_storage))
|
||||
|
||||
|
||||
@@ -250,6 +250,27 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)()
|
||||
/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_OOC
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_looc)()
|
||||
set name = "Show/Hide LOOC"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles seeing LocalOutOfCharacter chat"
|
||||
usr.client.prefs.chat_toggles ^= CHAT_LOOC
|
||||
usr.client.prefs.save_preferences()
|
||||
to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
|
||||
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing LOOC", "[usr.client.prefs.chat_toggles & CHAT_LOOC ? "Enabled" : "Disabled"]"))
|
||||
/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_LOOC
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_bank_card)()
|
||||
set name = "Show/Hide Income Updates"
|
||||
set category = "Preferences"
|
||||
set desc = "Show or hide updates to your income"
|
||||
usr.client.prefs.chat_toggles ^= CHAT_BANKCARD
|
||||
usr.client.prefs.save_preferences()
|
||||
to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "now" : "no longer"] be notified when you get paid.")
|
||||
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Income Notifications", "[(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "Enabled" : "Disabled"]"))
|
||||
/datum/verbs/menu/Settings/listen_bank_card/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_BANKCARD
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
|
||||
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
throwforce = 0
|
||||
slot_flags = ITEM_SLOT_EARS
|
||||
resistance_flags = NONE
|
||||
custom_price = 250
|
||||
|
||||
/obj/item/clothing/ears/earmuffs
|
||||
name = "earmuffs"
|
||||
@@ -30,6 +31,7 @@
|
||||
slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want!
|
||||
actions_types = list(/datum/action/item_action/toggle_headphones)
|
||||
var/headphones_on = FALSE
|
||||
custom_price = 125
|
||||
|
||||
/obj/item/clothing/ears/headphones/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
permeability_coefficient = 0.05
|
||||
resistance_flags = NONE
|
||||
var/can_be_cut = 1
|
||||
custom_price = 1200
|
||||
custom_premium_price = 1200
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
|
||||
desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly."
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
strip_mod = 0.9
|
||||
custom_price = 75
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist
|
||||
name = "armwraps"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
name = "white beanie"
|
||||
desc = "A stylish beanie. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their heads."
|
||||
icon_state = "beanie" //Default white
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/head/beanie/black
|
||||
name = "black beanie"
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
desc = "A reliable, blue tinted helmet reminding you that you <i>still</i> owe that engineer a beer."
|
||||
icon_state = "blueshift"
|
||||
item_state = "blueshift"
|
||||
custom_premium_price = 750
|
||||
|
||||
/obj/item/clothing/head/helmet/riot
|
||||
name = "riot helmet"
|
||||
|
||||
@@ -129,6 +129,7 @@
|
||||
dog_fashion = /datum/dog_fashion/head/pirate
|
||||
|
||||
/obj/item/clothing/head/pirate/captain
|
||||
name = "pirate captain hat"
|
||||
icon_state = "hgpiratecap"
|
||||
item_state = "hgpiratecap"
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
icon_state = "bluetie"
|
||||
item_state = "" //no inhands
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/neck/tie/blue
|
||||
name = "blue tie"
|
||||
@@ -87,6 +88,7 @@
|
||||
/obj/item/clothing/neck/scarf //Default white color, same functionality as beanies.
|
||||
name = "white scarf"
|
||||
icon_state = "scarf"
|
||||
custom_price = 60
|
||||
desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
|
||||
dog_fashion = /datum/dog_fashion/head
|
||||
|
||||
@@ -251,6 +253,40 @@
|
||||
icon = 'icons/obj/clothing/neck.dmi'
|
||||
icon_state = "bling"
|
||||
|
||||
/obj/item/clothing/neck/necklace/dope/merchant
|
||||
desc = "Don't ask how it works, the proof is in the holochips!"
|
||||
/// scales the amount received in case an admin wants to emulate taxes/fees.
|
||||
var/profit_scaling = 1
|
||||
/// toggles between sell (TRUE) and get price post-fees (FALSE)
|
||||
var/selling = FALSE
|
||||
|
||||
/obj/item/clothing/neck/necklace/dope/merchant/attack_self(mob/user)
|
||||
. = ..()
|
||||
selling = !selling
|
||||
to_chat(user, "<span class='notice'>[src] has been set to [selling ? "'Sell'" : "'Get Price'"] mode.</span>")
|
||||
|
||||
/obj/item/clothing/neck/necklace/dope/merchant/afterattack(obj/item/I, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
var/datum/export_report/ex = export_item_and_contents(I, allowed_categories = (ALL), dry_run=TRUE)
|
||||
var/price = 0
|
||||
for(var/x in ex.total_amount)
|
||||
price += ex.total_value[x]
|
||||
|
||||
if(price)
|
||||
var/true_price = round(price*profit_scaling)
|
||||
to_chat(user, "<span class='notice'>[selling ? "Sold" : "Getting the price of"] [I], value: <b>[true_price]</b> credits[I.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "<b>[round(price-true_price)]</b> credit\s taken as processing fee\s." : ""]</span>")
|
||||
if(selling)
|
||||
new /obj/item/holochip(get_turf(user),true_price)
|
||||
for(var/i in ex.exported_atoms_ref)
|
||||
var/atom/movable/AM = i
|
||||
if(QDELETED(AM))
|
||||
continue
|
||||
qdel(AM)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is no export value for [I] or any items within it.</span>")
|
||||
|
||||
//////////////////////////////////
|
||||
//VERY SUPER BADASS NECKERCHIEFS//
|
||||
//////////////////////////////////
|
||||
|
||||
@@ -3,15 +3,21 @@
|
||||
uniform = /obj/item/clothing/under/color/random
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
ears = /obj/item/radio/headset
|
||||
id = /obj/item/card/id
|
||||
id = /obj/item/card/id/locked_banking
|
||||
var/starting_funds = 350
|
||||
|
||||
/datum/outfit/vr/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
H.dna.species.before_equip_job(null, H)
|
||||
|
||||
/datum/outfit/vr/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
var/obj/item/card/id/id = H.wear_id
|
||||
if (istype(id))
|
||||
id.access |= get_all_accesses()
|
||||
if(!istype(id))
|
||||
return
|
||||
id.access |= get_all_accesses()
|
||||
if(id.registered_account)
|
||||
id.registered_account.account_holder = "[H.real_name] (VR)"
|
||||
if(starting_funds && id.bank_support == ID_LOCKED_BANK_ACCOUNT) //No payroll or ability to virtually transfer funds to an external account.
|
||||
id.registered_account.adjust_money(starting_funds)
|
||||
|
||||
/datum/outfit/vr/syndicate
|
||||
name = "Syndicate VR Operative - Basic"
|
||||
@@ -19,11 +25,12 @@
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
back = /obj/item/storage/backpack
|
||||
id = /obj/item/card/id/syndicate
|
||||
id = /obj/item/card/id/syndicate/locked_banking
|
||||
belt = /obj/item/gun/ballistic/automatic/pistol
|
||||
l_pocket = /obj/item/paper/fluff/vr/fluke_ops
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
/obj/item/kitchen/knife/combat/survival)
|
||||
starting_funds = 0 //Should be operating, not shopping.
|
||||
|
||||
/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
. = ..()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/item/clothing/shoes/sneakers
|
||||
dying_key = DYE_REGISTRY_SNEAKERS
|
||||
custom_price = 50
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/black
|
||||
name = "black shoes"
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
equip_delay_other = 50
|
||||
resistance_flags = NONE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 75)
|
||||
custom_price = 600
|
||||
|
||||
/obj/item/clothing/shoes/galoshes/dry
|
||||
name = "absorbent galoshes"
|
||||
@@ -382,6 +383,7 @@
|
||||
/obj/item/clothing/shoes/cowboyboots
|
||||
name = "cowboy boots"
|
||||
desc = "A standard pair of brown cowboy boots."
|
||||
custom_price = 60 //remember to replace these lame cosmetics with tg's YEEEEHAW counterparts.
|
||||
icon_state = "cowboyboots"
|
||||
|
||||
/obj/item/clothing/shoes/cowboyboots/black
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
desc = "A large, yet comfortable piece of armor, protecting you from some threats."
|
||||
icon_state = "blueshift"
|
||||
item_state = "blueshift"
|
||||
custom_premium_price = 750
|
||||
|
||||
/obj/item/clothing/suit/armor/hos
|
||||
name = "armored greatcoat"
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
icon_state = "overalls"
|
||||
item_state = "lb_suit"
|
||||
can_adjust = FALSE
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/under/misc/assistantformal
|
||||
name = "assistant's formal uniform"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
body_parts_covered = GROIN|LEGS
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = FALSE
|
||||
custom_price = 60
|
||||
mutantrace_variation = STYLE_DIGITIGRADE //how do they show up on taurs otherwise?
|
||||
|
||||
/obj/item/clothing/under/pants/classicjeans
|
||||
@@ -14,6 +15,7 @@
|
||||
name = "Must Hang jeans"
|
||||
desc = "Made in the finest space jeans factory this side of Alpha Centauri."
|
||||
icon_state = "jeansmustang"
|
||||
custom_price = 180
|
||||
|
||||
/obj/item/clothing/under/pants/blackjeans
|
||||
name = "black jeans"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/under/dress/skirt/red
|
||||
name = "red skirt"
|
||||
@@ -26,6 +27,7 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/under/dress/skirt/purple
|
||||
name = "purple skirt"
|
||||
@@ -35,6 +37,7 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/under/dress/sundress
|
||||
name = "sundress"
|
||||
@@ -148,6 +151,7 @@
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/under/dress/skirt/plaid/blue
|
||||
name = "blue plaid skirt"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/item/proc/get_item_credit_value()
|
||||
return
|
||||
@@ -0,0 +1,120 @@
|
||||
#define DUMPTIME 3000
|
||||
|
||||
/datum/bank_account
|
||||
var/account_holder = "Rusty Venture"
|
||||
var/account_balance = 0
|
||||
var/datum/job/account_job
|
||||
var/list/bank_cards = list()
|
||||
var/add_to_accounts = TRUE
|
||||
var/transferable = TRUE
|
||||
var/account_id
|
||||
var/being_dumped = FALSE //pink levels are rising
|
||||
var/withdrawDelay = 0
|
||||
|
||||
/datum/bank_account/New(newname, job)
|
||||
if(add_to_accounts)
|
||||
if(!SSeconomy)
|
||||
log_world("Wack")
|
||||
SSeconomy.bank_accounts += src
|
||||
account_holder = newname
|
||||
account_job = job
|
||||
account_id = rand(111111,999999)
|
||||
|
||||
/datum/bank_account/Destroy()
|
||||
if(add_to_accounts)
|
||||
SSeconomy.bank_accounts -= src
|
||||
return ..()
|
||||
|
||||
/datum/bank_account/proc/dumpeet()
|
||||
being_dumped = TRUE
|
||||
withdrawDelay = world.time + DUMPTIME
|
||||
|
||||
/datum/bank_account/proc/_adjust_money(amt)
|
||||
account_balance += amt
|
||||
if(account_balance < 0)
|
||||
account_balance = 0
|
||||
|
||||
/datum/bank_account/proc/has_money(amt)
|
||||
return account_balance >= amt
|
||||
|
||||
/datum/bank_account/proc/adjust_money(amt)
|
||||
if((amt < 0 && has_money(-amt)) || amt > 0)
|
||||
_adjust_money(amt)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/bank_account/proc/transfer_money(datum/bank_account/from, amount)
|
||||
if(!from.transferable || !from.has_money(amount))
|
||||
return FALSE
|
||||
adjust_money(amount)
|
||||
from.adjust_money(-amount)
|
||||
return TRUE
|
||||
|
||||
/datum/bank_account/proc/payday(amt_of_paychecks, free = FALSE)
|
||||
var/money_to_transfer = account_job.paycheck * amt_of_paychecks
|
||||
if(free)
|
||||
adjust_money(money_to_transfer)
|
||||
else
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(account_job.paycheck_department)
|
||||
if(D)
|
||||
if(!transfer_money(D, money_to_transfer))
|
||||
bank_card_talk("ERROR: Payday aborted, departmental funds insufficient.")
|
||||
return FALSE
|
||||
else
|
||||
bank_card_talk("Payday processed, account now holds [account_balance] cr.")
|
||||
return TRUE
|
||||
bank_card_talk("ERROR: Payday aborted, unable to contact departmental account.")
|
||||
return FALSE
|
||||
|
||||
/datum/bank_account/proc/bank_card_talk(message, force)
|
||||
if(!message || !bank_cards.len)
|
||||
return
|
||||
for(var/obj/A in bank_cards)
|
||||
var/icon_source = A
|
||||
/*
|
||||
if(istype(A, /obj/item/card/id))
|
||||
var/obj/item/card/id/id_card = A
|
||||
if(id_card.uses_overlays)
|
||||
icon_source = id_card.get_cached_flat_icon()
|
||||
*/
|
||||
var/mob/card_holder = recursive_loc_check(A, /mob)
|
||||
if(ismob(card_holder)) //If on a mob
|
||||
if(!card_holder.client || (!(card_holder.client.prefs.chat_toggles & CHAT_BANKCARD) && !force))
|
||||
return
|
||||
|
||||
card_holder.playsound_local(get_turf(card_holder), 'sound/machines/twobeep.ogg', 50, TRUE)
|
||||
if(card_holder.can_hear())
|
||||
to_chat(card_holder, "[icon2html(icon_source, card_holder)] <span class='notice'>[message]</span>")
|
||||
else if(isturf(A.loc)) //If on the ground
|
||||
for(var/mob/M in hearers(1,get_turf(A)))
|
||||
if(M.client && !(M.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)
|
||||
return
|
||||
playsound(A, 'sound/machines/twobeep.ogg', 50, TRUE)
|
||||
A.audible_message("[icon2html(icon_source, hearers(A))] <span class='notice'>[message]</span>", null, 1)
|
||||
break
|
||||
else
|
||||
for(var/mob/M in A.loc) //If inside a container with other mobs (e.g. locker)
|
||||
if(!M.client || (!(M.client.prefs.chat_toggles & CHAT_BANKCARD) && !force))
|
||||
return
|
||||
M.playsound_local(get_turf(M), 'sound/machines/twobeep.ogg', 50, TRUE)
|
||||
if(M.can_hear())
|
||||
to_chat(M, "[icon2html(icon_source, M)] <span class='notice'>[message]</span>")
|
||||
|
||||
/datum/bank_account/department
|
||||
account_holder = "Guild Credit Agency"
|
||||
var/department_id = "REPLACE_ME"
|
||||
add_to_accounts = FALSE
|
||||
|
||||
/datum/bank_account/department/New(dep_id, budget)
|
||||
department_id = dep_id
|
||||
account_balance = budget
|
||||
account_holder = SSeconomy.department_accounts[dep_id]
|
||||
SSeconomy.generated_accounts += src
|
||||
|
||||
/datum/bank_account/remote // Bank account not belonging to the local station
|
||||
add_to_accounts = FALSE
|
||||
|
||||
/datum/bank_account/remote/non_transferable
|
||||
transferable = FALSE
|
||||
|
||||
#undef DUMPTIME
|
||||
@@ -0,0 +1,138 @@
|
||||
/obj/machinery/paystand
|
||||
name = "unregistered pay stand"
|
||||
desc = "See title."
|
||||
icon = 'icons/obj/economy.dmi'
|
||||
icon_state = "card_scanner"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/locked = FALSE
|
||||
var/obj/item/card/id/my_card
|
||||
var/obj/item/assembly/signaler/signaler //attached signaler, let people attach signalers that get activated if the user's transaction limit is achieved.
|
||||
var/signaler_threshold = 0 //signaler threshold amount
|
||||
var/amount_deposited = 0 //keep track of the amount deposited over time so you can pay multiple times to reach the signaler threshold
|
||||
var/force_fee = 0 //replaces the "pay whatever" functionality with a set amount when non-zero.
|
||||
|
||||
/obj/machinery/paystand/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/card/id))
|
||||
if(W == my_card)
|
||||
if(user.a_intent == INTENT_DISARM)
|
||||
var/rename_msg = stripped_input(user, "Rename the Paystand:", "Paystand Naming", name)
|
||||
if(!rename_msg || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
name = rename_msg
|
||||
return
|
||||
else if(user.a_intent == INTENT_GRAB)
|
||||
var/force_fee_input = input(user,"Set the fee!","Set a fee!",0) as num|null
|
||||
if(isnull(force_fee_input) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
force_fee = force_fee_input
|
||||
return
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='notice'>You [src.locked ? "lock" : "unlock"] the paystand, protecting the bolts from [anchored ? "loosening" : "tightening"].</span>")
|
||||
return
|
||||
if(!my_card)
|
||||
var/obj/item/card/id/assistant_mains_need_to_die = W
|
||||
if(!assistant_mains_need_to_die.registered_account)
|
||||
return
|
||||
var/msg = stripped_input(user, "Name of pay stand:", "Paystand Naming", "[user]'s Awesome Paystand")
|
||||
if(!msg)
|
||||
return
|
||||
name = msg
|
||||
desc = "Owned by [assistant_mains_need_to_die.registered_account.account_holder], pays directly into [user.p_their()] account."
|
||||
my_card = assistant_mains_need_to_die
|
||||
to_chat(user, "You link the stand to your account.")
|
||||
return
|
||||
var/obj/item/card/id/vbucks = W
|
||||
if(vbucks.registered_account)
|
||||
var/momsdebitcard = 0
|
||||
if(!force_fee)
|
||||
momsdebitcard = input(user, "How much would you like to deposit?", "Money Deposit") as null|num
|
||||
else
|
||||
momsdebitcard = force_fee
|
||||
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
if(momsdebitcard < 1)
|
||||
to_chat(user, "<span class='warning'>ERROR: Invalid amount designated.</span>")
|
||||
return
|
||||
if(vbucks.registered_account.adjust_money(-momsdebitcard))
|
||||
purchase(vbucks.registered_account.account_holder, momsdebitcard)
|
||||
to_chat(user, "Thanks for purchasing! The vendor has been informed.")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>ERROR: Account has insufficient funds to make transaction.</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>ERROR: No bank account assigned to identification card.</span>")
|
||||
return
|
||||
if(istype(W, /obj/item/holochip))
|
||||
var/obj/item/holochip/H = W
|
||||
var/cashmoney = input(user, "How much would you like to deposit?", "Money Deposit") as null|num
|
||||
if(H.spend(cashmoney, FALSE))
|
||||
purchase(user, cashmoney)
|
||||
to_chat(user, "Thanks for purchasing! The vendor has been informed.")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>ERROR: Insufficient funds to make transaction.</span>")
|
||||
return
|
||||
if(istype(W, /obj/item/stack/spacecash))
|
||||
to_chat(user, "What is this, the 2000s? We only take card here.")
|
||||
return
|
||||
if(istype(W, /obj/item/coin))
|
||||
to_chat(user, "What is this, the 1800s? We only take card here.")
|
||||
return
|
||||
if(istype(W, /obj/item/assembly/signaler))
|
||||
var/obj/item/assembly/signaler/S = W
|
||||
if(S.secured)
|
||||
to_chat(user, "<span class='warning'>The signaler needs to be in attachable mode to add it to the paystand!</span>")
|
||||
return
|
||||
if(!my_card)
|
||||
to_chat(user, "<span class='warning'>ERROR: No identification card has been assigned to this paystand yet!</span>")
|
||||
return
|
||||
if(!signaler)
|
||||
var/cash_limit = input(user, "Enter the minimum amount of cash needed to deposit before the signaler is activated.", "Signaler Activation Threshold") as null|num
|
||||
if(cash_limit < 1)
|
||||
to_chat(user, "<span class='warning'>ERROR: Invalid amount designated.</span>")
|
||||
return
|
||||
if(cash_limit)
|
||||
S.forceMove(src)
|
||||
signaler = S
|
||||
signaler_threshold = cash_limit
|
||||
to_chat(user, "You attach the signaler to the paystand.")
|
||||
desc += " A signaler appears to be attached to the scanner."
|
||||
else
|
||||
to_chat(user, "<span class='warning'>A signaler is already attached to this unit!</span>")
|
||||
|
||||
if(default_deconstruction_screwdriver(user, "card_scanner", "card_scanner", W))
|
||||
return
|
||||
|
||||
else if(default_pry_open(W))
|
||||
return
|
||||
|
||||
else if(default_unfasten_wrench(user, W))
|
||||
return
|
||||
|
||||
else if(default_deconstruction_crowbar(W))
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/paystand/proc/purchase(buyer, price)
|
||||
my_card.registered_account.adjust_money(price)
|
||||
my_card.registered_account.bank_card_talk("Purchase made at your vendor by [buyer] for [price] credits.")
|
||||
amount_deposited = amount_deposited + price
|
||||
if(signaler && amount_deposited >= signaler_threshold)
|
||||
signaler.activate()
|
||||
amount_deposited = 0
|
||||
|
||||
/obj/machinery/paystand/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
|
||||
if(locked)
|
||||
to_chat(user, "<span class='warning'>The bolts on this paystand are currently covered!</span>")
|
||||
return FALSE
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/paystand/examine(mob/user)
|
||||
. = ..()
|
||||
if(force_fee)
|
||||
. += "<span class='warning'>This paystand forces a payment of <b>[force_fee]</b> credit\s per swipe instead of a variable amount.</span>"
|
||||
if(user.get_active_held_item() == my_card)
|
||||
. += "<span class='notice'>Paystands can be edited through swiping your card with different intents. <b>Disarm</b> allows editing the name while <b>Grab</b> changes payment functionality.</span>"
|
||||
@@ -29,7 +29,9 @@
|
||||
if(fake)
|
||||
return
|
||||
threat_message = new
|
||||
payoff = round(SSshuttle.points * 0.80)
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
payoff = round(D.account_balance * 0.80)
|
||||
threat_message.title = "Business proposition"
|
||||
threat_message.content = "This is [ship_name]. Pay up [payoff] credits or you'll walk the plank."
|
||||
threat_message.possible_answers = list("We'll pay.","No way.")
|
||||
@@ -38,13 +40,14 @@
|
||||
|
||||
/datum/round_event/pirates/proc/answered()
|
||||
if(threat_message && threat_message.answered == 1)
|
||||
if(SSshuttle.points >= payoff)
|
||||
SSshuttle.points -= payoff
|
||||
priority_announce("Thanks for the credits, landlubbers.",sender_override = ship_name)
|
||||
paid_off = TRUE
|
||||
return
|
||||
else
|
||||
priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name)
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
if(D.adjust_money(-payoff))
|
||||
priority_announce("Thanks for the credits, landlubbers.",sender_override = ship_name)
|
||||
paid_off = TRUE
|
||||
return
|
||||
else
|
||||
priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name)
|
||||
if(!shuttle_spawned)
|
||||
spawn_shuttle()
|
||||
|
||||
@@ -104,9 +107,10 @@
|
||||
/obj/machinery/shuttle_scrambler/process()
|
||||
if(active)
|
||||
if(is_station_level(z))
|
||||
var/siphoned = min(SSshuttle.points,siphon_per_tick)
|
||||
SSshuttle.points -= siphoned
|
||||
credits_stored += siphoned
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
var/siphoned = min(D.account_balance,siphon_per_tick)
|
||||
D.adjust_money(-siphoned)
|
||||
interrupt_research()
|
||||
else
|
||||
return
|
||||
@@ -142,14 +146,9 @@
|
||||
new /obj/effect/temp_visual/emp(get_turf(S))
|
||||
|
||||
/obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user)
|
||||
if(credits_stored < 200)
|
||||
to_chat(user,"<span class='notice'>Not enough credits to retrieve.</span>")
|
||||
return
|
||||
while(credits_stored >= 200)
|
||||
new /obj/item/stack/spacecash/c200(drop_location())
|
||||
credits_stored -= 200
|
||||
to_chat(user,"<span class='notice'>You retrieve the siphoned credits!</span>")
|
||||
credits_stored = 0
|
||||
new /obj/item/holochip(drop_location(), credits_stored)
|
||||
to_chat(user,"<span class='notice'>You retrieve the siphoned credits!</span>")
|
||||
credits_stored = 0
|
||||
|
||||
/obj/machinery/shuttle_scrambler/proc/send_notification()
|
||||
priority_announce("Data theft signal detected, source registered on local gps units.")
|
||||
@@ -470,3 +469,11 @@
|
||||
var/obj/item/stack/spacecash/C = O
|
||||
return ..() * C.amount * C.value
|
||||
|
||||
/datum/export/pirate/holochip
|
||||
cost = 1
|
||||
unit_name = "holochip"
|
||||
export_types = list(/obj/item/holochip)
|
||||
|
||||
/datum/export/pirate/holochip/get_cost(atom/movable/AM)
|
||||
var/obj/item/holochip/H = AM
|
||||
return H.credits
|
||||
|
||||
@@ -69,7 +69,9 @@
|
||||
priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.")
|
||||
|
||||
dispatched = 1
|
||||
SSshuttle.points += bonus_points
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
D.adjust_money(bonus_points)
|
||||
endWhen = activeFor + 1
|
||||
|
||||
SSshuttle.supply.mode = SHUTTLE_CALL
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
return
|
||||
if (!(locate(/obj/structure/table) in src_location) || !(locate(/obj/structure/table) in over_location))
|
||||
return
|
||||
|
||||
|
||||
//Are we an expert slider?
|
||||
var/datum/action/innate/D = get_action_of_type(user, /datum/action/innate/drink_fling)
|
||||
if(!D?.active)
|
||||
@@ -268,6 +268,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/ice
|
||||
name = "ice cup"
|
||||
desc = "Careful, cold ice, do not chew."
|
||||
custom_price = 15
|
||||
icon_state = "coffee"
|
||||
list_reagents = list(/datum/reagent/consumable/ice = 30)
|
||||
spillable = TRUE
|
||||
@@ -281,7 +282,7 @@
|
||||
spillable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/mug/on_reagent_change(changetype)
|
||||
cut_overlays()
|
||||
cut_overlays()
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/MA = mutable_appearance(icon,"mugoverlay")
|
||||
MA.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
@@ -302,6 +303,7 @@
|
||||
list_reagents = list(/datum/reagent/consumable/hot_coco = 30, /datum/reagent/consumable/sugar = 5)
|
||||
foodtype = SUGAR
|
||||
resistance_flags = FREEZE_PROOF
|
||||
custom_price = 120
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/dry_ramen
|
||||
name = "cup ramen"
|
||||
@@ -310,6 +312,7 @@
|
||||
list_reagents = list(/datum/reagent/consumable/dry_ramen = 30)
|
||||
foodtype = GRAIN
|
||||
isGlass = FALSE
|
||||
custom_price = 95
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/beer
|
||||
name = "space beer"
|
||||
@@ -317,6 +320,7 @@
|
||||
icon_state = "beer"
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30)
|
||||
foodtype = GRAIN | ALCOHOL
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/beer/light
|
||||
name = "Carp Lite"
|
||||
@@ -417,6 +421,7 @@
|
||||
custom_materials = list(/datum/material/iron=250)
|
||||
volume = 60
|
||||
isGlass = FALSE
|
||||
custom_price = 200
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/flask/gold
|
||||
name = "captain's flask"
|
||||
@@ -447,6 +452,7 @@
|
||||
reagent_flags = NONE
|
||||
spillable = FALSE
|
||||
isGlass = FALSE
|
||||
custom_price = 45
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] is trying to eat \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
|
||||
@@ -254,6 +254,7 @@
|
||||
var/shortname = pickweight(
|
||||
list("T&T" = 1, "A&A" = 1, "Generic" = 1))
|
||||
var/fullname
|
||||
var/removals = GLOB.redacted_strings.Copy()
|
||||
switch(shortname)
|
||||
if("T&T")
|
||||
fullname = "Teal and Tealer"
|
||||
@@ -261,9 +262,6 @@
|
||||
fullname = "Ash and Asher"
|
||||
if("Generic")
|
||||
fullname = "Nanotrasen Cheap Imitations"
|
||||
var/removals = list("\[REDACTED\]", "\[EXPLETIVE DELETED\]",
|
||||
"\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]",
|
||||
"\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]")
|
||||
var/chance = 50
|
||||
|
||||
if(prob(chance))
|
||||
@@ -348,6 +346,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/applejack
|
||||
name = "Buckin' Bronco's Applejack"
|
||||
desc = "Kicks like a horse, tastes like an apple!"
|
||||
custom_price = 100
|
||||
icon_state = "applejack_bottle"
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/applejack = 100)
|
||||
foodtype = FRUIT
|
||||
@@ -358,6 +357,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/champagne
|
||||
name = "Eau d' Dandy Brut Champagne"
|
||||
desc = "Finely sourced from only the most pretentious French vineyards."
|
||||
custom_premium_price = 250
|
||||
icon_state = "champagne_bottle"
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/champagne = 100)
|
||||
|
||||
@@ -376,6 +376,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/trappist
|
||||
name = "Mont de Requin Trappistes Bleu"
|
||||
desc = "Brewed in space-Belgium. Fancy!"
|
||||
custom_premium_price = 170
|
||||
icon_state = "trappistbottle"
|
||||
volume = 50
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/trappist = 50)
|
||||
@@ -388,6 +389,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
|
||||
name = "orange juice"
|
||||
desc = "Full of vitamins and deliciousness!"
|
||||
custom_price = 100
|
||||
icon_state = "orangejuice"
|
||||
item_state = "carton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
@@ -409,6 +411,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/cream
|
||||
name = "milk cream"
|
||||
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
|
||||
custom_price = 100
|
||||
icon_state = "cream"
|
||||
item_state = "carton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
@@ -420,6 +423,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
|
||||
name = "tomato juice"
|
||||
desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
|
||||
custom_price = 100
|
||||
icon_state = "tomatojuice"
|
||||
item_state = "carton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
@@ -431,6 +435,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/limejuice
|
||||
name = "lime juice"
|
||||
desc = "Sweet-sour goodness."
|
||||
custom_price = 100
|
||||
icon_state = "limejuice"
|
||||
item_state = "carton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
@@ -464,6 +469,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/menthol
|
||||
name = "menthol"
|
||||
desc = "Tastes naturally minty, and imparts a very mild numbing sensation."
|
||||
custom_price = 100
|
||||
icon_state = "mentholbox"
|
||||
item_state = "carton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
@@ -474,6 +480,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/grenadine
|
||||
name = "Jester Grenadine"
|
||||
desc = "Contains 0% real cherries!"
|
||||
custom_price = 100
|
||||
icon_state = "grenadine"
|
||||
isGlass = TRUE
|
||||
list_reagents = list(/datum/reagent/consumable/grenadine = 100)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
spillable = TRUE
|
||||
resistance_flags = ACID_PROOF
|
||||
obj_flags = UNIQUE_RENAME
|
||||
custom_price = 25
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change(changetype)
|
||||
cut_overlays()
|
||||
@@ -46,6 +47,7 @@
|
||||
possible_transfer_amounts = list()
|
||||
volume = 15
|
||||
custom_materials = list(/datum/material/glass=100)
|
||||
custom_price = 20
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change(changetype)
|
||||
cut_overlays()
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("salt" = 1, "crisps" = 1)
|
||||
foodtype = JUNKFOOD | FRIED
|
||||
custom_price = 90
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/no_raisin
|
||||
name = "4no raisins"
|
||||
@@ -68,6 +69,7 @@
|
||||
junkiness = 25
|
||||
filling_color = "#FFD700"
|
||||
foodtype = JUNKFOOD | GRAIN | SUGAR
|
||||
custom_price = 30
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cheesiehonkers
|
||||
name = "cheesie honkers"
|
||||
@@ -79,6 +81,7 @@
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("cheese" = 5, "crisps" = 2)
|
||||
foodtype = JUNKFOOD | DAIRY | SUGAR
|
||||
custom_price = 45
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/syndicake
|
||||
name = "syndi-cakes"
|
||||
|
||||
@@ -56,6 +56,9 @@
|
||||
//can be overridden by antag_rep.txt config
|
||||
var/antag_rep = 10
|
||||
|
||||
var/paycheck = PAYCHECK_MINIMAL
|
||||
var/paycheck_department = ACCOUNT_CIV
|
||||
|
||||
var/list/mind_traits // Traits added to the mind of the mob assigned this job
|
||||
var/list/blacklisted_quirks //list of quirk typepaths blacklisted.
|
||||
|
||||
@@ -104,7 +107,13 @@
|
||||
/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source)
|
||||
if(!H)
|
||||
return FALSE
|
||||
|
||||
if(!visualsOnly)
|
||||
var/datum/bank_account/bank_account = new(H.real_name, src)
|
||||
bank_account.account_holder = H.real_name
|
||||
bank_account.account_job = src
|
||||
bank_account.account_id = rand(111111,999999)
|
||||
bank_account.payday(STARTING_PAYCHECKS, TRUE)
|
||||
H.account_id = bank_account.account_id
|
||||
if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions))
|
||||
if(H.dna.species.id != "human")
|
||||
H.set_species(/datum/species/human)
|
||||
@@ -242,12 +251,18 @@
|
||||
H.real_name = "[J.title] #[rand(10000, 99999)]"
|
||||
|
||||
var/obj/item/card/id/C = H.wear_id
|
||||
if(istype(C))
|
||||
if(istype(C) && C.bank_support)
|
||||
C.access = J.get_access()
|
||||
shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable
|
||||
C.registered_name = H.real_name
|
||||
C.assignment = J.title
|
||||
C.update_label()
|
||||
for(var/A in SSeconomy.bank_accounts)
|
||||
var/datum/bank_account/B = A
|
||||
if(B.account_id == H.account_id)
|
||||
C.registered_account = B
|
||||
B.bank_cards += C
|
||||
break
|
||||
H.sec_hud_set_ID()
|
||||
|
||||
var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot)
|
||||
|
||||
@@ -14,6 +14,8 @@ Assistant
|
||||
minimal_access = list() //See /datum/job/assistant/get_access()
|
||||
outfit = /datum/outfit/job/assistant
|
||||
antag_rep = 7
|
||||
paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it.
|
||||
paycheck_department = ACCOUNT_CIV
|
||||
display_order = JOB_DISPLAY_ORDER_ASSISTANT
|
||||
dresscodecompliant = FALSE
|
||||
threat = 0.2
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE,
|
||||
ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_ENG
|
||||
|
||||
starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_BASIC))
|
||||
skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
|
||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_SRV
|
||||
display_order = JOB_DISPLAY_ORDER_BARTENDER
|
||||
threat = 0.5
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_SRV
|
||||
display_order = JOB_DISPLAY_ORDER_BOTANIST
|
||||
threat = 1.5 // lol powergame
|
||||
|
||||
|
||||
@@ -15,11 +15,15 @@
|
||||
exp_type = EXP_TYPE_COMMAND
|
||||
exp_type_department = EXP_TYPE_COMMAND
|
||||
|
||||
|
||||
outfit = /datum/outfit/job/captain
|
||||
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
|
||||
paycheck = PAYCHECK_COMMAND
|
||||
paycheck_department = ACCOUNT_SEC
|
||||
|
||||
mind_traits = list(TRAIT_CAPTAIN_METABOLISM, TRAIT_DISK_VERIFIER)
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CAPTAIN
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
||||
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_CAR
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN
|
||||
threat = 0.2
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
||||
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_CIV
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CHAPLAIN
|
||||
threat = 0.5
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_MED
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CHEMIST
|
||||
threat = 1.5
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
|
||||
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
|
||||
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_COMMAND
|
||||
paycheck_department = ACCOUNT_ENG
|
||||
|
||||
starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_TRAINED))
|
||||
skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM,
|
||||
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
|
||||
ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS)
|
||||
paycheck = PAYCHECK_COMMAND
|
||||
paycheck_department = ACCOUNT_MED
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
access = list(ACCESS_THEATRE)
|
||||
minimal_access = list(ACCESS_THEATRE)
|
||||
paycheck = PAYCHECK_MINIMAL
|
||||
paycheck_department = ACCOUNT_SRV
|
||||
|
||||
mind_traits = list(TRAIT_CLOWN_MENTALITY)
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
|
||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_SRV
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_COOK
|
||||
threat = 0.2
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
access = list(ACCESS_LIBRARY)
|
||||
minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_CIV
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CURATOR
|
||||
threat = 0.3
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_SEC
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_MED
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_GENETICIST
|
||||
threat = 1.5
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER,
|
||||
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
|
||||
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_COMMAND
|
||||
paycheck_department = ACCOUNT_SRV
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
|
||||
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
|
||||
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_COMMAND
|
||||
paycheck_department = ACCOUNT_SEC
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity)
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_SRV
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_JANITOR
|
||||
threat = 0.2
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
|
||||
access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||
paycheck = PAYCHECK_EASY
|
||||
paycheck_department = ACCOUNT_CIV
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_MED
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR
|
||||
threat = 0.5
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
access = list(ACCESS_THEATRE)
|
||||
minimal_access = list(ACCESS_THEATRE)
|
||||
paycheck = PAYCHECK_MINIMAL
|
||||
paycheck_department = ACCOUNT_SRV
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_MIME
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS)
|
||||
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_MED
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_PARAMEDIC
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING,
|
||||
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE,
|
||||
ACCESS_SEC_DOORS, ACCESS_HEADS)
|
||||
paycheck = PAYCHECK_HARD //They can already buy stuff using cargo budget, don't give em a command-level paycheck.
|
||||
paycheck_department = ACCOUNT_CAR
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_QUARTERMASTER
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD,
|
||||
ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM,
|
||||
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
|
||||
paycheck = PAYCHECK_COMMAND
|
||||
paycheck_department = ACCOUNT_SCI
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS)
|
||||
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_SCI
|
||||
|
||||
starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_TRAINED))
|
||||
skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS)
|
||||
minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_SCI
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_SCIENTIST
|
||||
threat = 1.2
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
|
||||
paycheck = PAYCHECK_HARD
|
||||
paycheck_department = ACCOUNT_SEC
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
||||
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_HARD
|
||||
paycheck_department = ACCOUNT_CAR
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_ENG
|
||||
|
||||
starting_skills = list(/datum/skill/level/job/wiring = GET_STANDARD_LVL(JOB_SKILL_TRAINED))
|
||||
skill_affinities = list(/datum/skill/level/job/wiring = STARTING_SKILL_AFFINITY_WIRING_ENGI_ROBO)
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
paycheck = PAYCHECK_MEDIUM
|
||||
paycheck_department = ACCOUNT_MED
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_VIROLOGIST
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access()
|
||||
|
||||
paycheck = PAYCHECK_HARD
|
||||
paycheck_department = ACCOUNT_SEC
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_WARDEN
|
||||
|
||||
@@ -14,6 +14,5 @@
|
||||
"incas", "int", "elc", "ent", "aws", "qip", "nas", "vil", "jens", "dila", "fa",
|
||||
"la", "re", "do", "ji", "ae", "so", "qe", "ce", "na", "mo", "ha", "yu"
|
||||
)
|
||||
icon = 'icons/obj/hydroponics/harvest.dmi'
|
||||
icon_state = "lily"
|
||||
icon_state = "plant"
|
||||
default_priority = 90
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
||||
STR.max_items = 40
|
||||
STR.max_combined_w_class = 40
|
||||
STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash))
|
||||
STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/holochip))
|
||||
|
||||
/obj/item/storage/bag/money/vault/PopulateContents()
|
||||
new /obj/item/coin/silver(src)
|
||||
|
||||
@@ -340,6 +340,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
var/datum/material/M = i
|
||||
value += M.value_per_unit * custom_materials[M]
|
||||
|
||||
/obj/item/coin/get_item_credit_value()
|
||||
return value
|
||||
|
||||
/obj/item/coin/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] contemplates suicide with \the [src]!</span>")
|
||||
if (!attack_self(user))
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
nutrition_ratio *= 1.2
|
||||
if(satiety > 80)
|
||||
nutrition_ratio *= 1.25
|
||||
nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR)
|
||||
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR)
|
||||
blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio)
|
||||
|
||||
//Effects of bloodloss
|
||||
|
||||
@@ -21,10 +21,10 @@ Doesn't work on other aliens/AI.*/
|
||||
. = ..()
|
||||
action = new(src)
|
||||
|
||||
/obj/effect/proc_holder/alien/Trigger(mob/living/carbon/user, skip_cost_check)
|
||||
if(!istype(user))
|
||||
/obj/effect/proc_holder/alien/Trigger(mob/living/carbon/user, skip_cost_check = FALSE)
|
||||
if(!skip_cost_check || !istype(user))
|
||||
return TRUE
|
||||
if(!skip_cost_check || cost_check(check_turf,user))
|
||||
if(cost_check(check_turf,user))
|
||||
if(fire(user) && user) // Second check to prevent runtimes when evolving
|
||||
user.adjustPlasma(-plasma_cost)
|
||||
return TRUE
|
||||
|
||||
@@ -520,7 +520,7 @@
|
||||
playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!blood)
|
||||
nutrition -= lost_nutrition
|
||||
adjust_nutrition(-lost_nutrition)
|
||||
adjustToxLoss(-3)
|
||||
for(var/i=0 to distance)
|
||||
if(blood)
|
||||
|
||||
@@ -24,11 +24,12 @@
|
||||
. = ..()
|
||||
if(. && (movement_type & FLOATING)) //floating is easy
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous
|
||||
set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous
|
||||
else if(nutrition && stat != DEAD)
|
||||
nutrition -= HUNGER_FACTOR/10
|
||||
var/loss = HUNGER_FACTOR/10
|
||||
if(m_intent == MOVE_INTENT_RUN)
|
||||
nutrition -= HUNGER_FACTOR/10
|
||||
loss *= 2
|
||||
adjust_nutrition(loss)
|
||||
|
||||
/mob/living/carbon/can_move_under_living(mob/living/other)
|
||||
. = ..()
|
||||
|
||||
@@ -68,4 +68,5 @@
|
||||
var/creamed = FALSE //to use with creampie overlays
|
||||
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
|
||||
var/lastpuke = 0
|
||||
var/account_id
|
||||
var/last_fire_update
|
||||
|
||||
@@ -127,6 +127,17 @@
|
||||
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/proc/get_bank_account()
|
||||
RETURN_TYPE(/datum/bank_account)
|
||||
var/datum/bank_account/account
|
||||
var/obj/item/card/id/I = get_idcard()
|
||||
|
||||
if(I && I.registered_account)
|
||||
account = I.registered_account
|
||||
return account
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/can_see_reagents()
|
||||
. = ..()
|
||||
if(.) //No need to run through all of this if it's already true.
|
||||
|
||||
@@ -1290,7 +1290,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
H.Jitter(5)
|
||||
hunger_rate = 3 * HUNGER_FACTOR
|
||||
hunger_rate *= H.physiology.hunger_mod
|
||||
H.nutrition = max(0, H.nutrition - hunger_rate)
|
||||
H.adjust_nutrition(-hunger_rate)
|
||||
|
||||
|
||||
if (H.nutrition > NUTRITION_LEVEL_FULL)
|
||||
|
||||
@@ -293,9 +293,7 @@
|
||||
if(isturf(H.loc)) //else, there's considered to be no light
|
||||
var/turf/T = H.loc
|
||||
light_amount = min(1,T.get_lumcount()) - 0.5
|
||||
H.nutrition += light_amount * 10
|
||||
if(H.nutrition > NUTRITION_LEVEL_FULL)
|
||||
H.nutrition = NUTRITION_LEVEL_FULL
|
||||
H.adjust_nutrition(light_amount * 10, NUTRITION_LEVEL_FULL)
|
||||
if(light_amount > 0.2) //if there's enough light, heal
|
||||
H.heal_overall_damage(1,1)
|
||||
H.adjustToxLoss(-1)
|
||||
|
||||
@@ -36,9 +36,7 @@
|
||||
if(isturf(H.loc)) //else, there's considered to be no light
|
||||
var/turf/T = H.loc
|
||||
light_amount = min(1,T.get_lumcount()) - 0.5
|
||||
H.nutrition += light_amount * light_nutrition_gain_factor
|
||||
if(H.nutrition >= NUTRITION_LEVEL_FULL)
|
||||
H.nutrition = NUTRITION_LEVEL_FULL - 1
|
||||
H.adjust_nutrition(light_amount * light_nutrition_gain_factor, NUTRITION_LEVEL_FULL)
|
||||
if(light_amount > 0.2) //if there's enough light, heal
|
||||
H.heal_overall_damage(light_bruteheal, light_burnheal)
|
||||
H.adjustToxLoss(-light_toxheal)
|
||||
@@ -70,8 +68,7 @@
|
||||
H.adjustFireLoss(rand(5,15))
|
||||
H.show_message("<span class='userdanger'>The radiation beam singes you!</span>")
|
||||
if(/obj/item/projectile/energy/florayield)
|
||||
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
|
||||
|
||||
H.adjust_nutrition(30, NUTRITION_LEVEL_FULL)
|
||||
|
||||
/datum/species/pod/pseudo_weak
|
||||
name = "Anthromorphic Plant"
|
||||
|
||||
@@ -476,7 +476,7 @@
|
||||
if(SSmobs.times_fired%3==1)
|
||||
if(!(M.status_flags & GODMODE))
|
||||
M.adjustBruteLoss(5)
|
||||
nutrition += 10
|
||||
adjust_nutrition(10)
|
||||
|
||||
|
||||
/*
|
||||
@@ -502,11 +502,23 @@ GLOBAL_LIST_INIT(ballmer_good_msg, list("Hey guys, what if we rolled out a blues
|
||||
"Hear me out here. What if, and this is just a theory, we made R&D controllable from our PDAs?",
|
||||
"I'm thinking we should roll out a git repository for our research under the AGPLv3 license so that we can share it among the other stations freely.",
|
||||
"I dunno about you guys, but IDs and PDAs being separate is clunky as fuck. Maybe we should merge them into a chip in our arms? That way they can't be stolen easily.",
|
||||
"Why the fuck aren't we just making every pair of shoes into galoshes? We have the technology."))
|
||||
"Why the fuck aren't we just making every pair of shoes into galoshes? We have the technology.",
|
||||
"We can link the Ore Silo to our protolathes, so why don't we also link it to autolathes?",
|
||||
"If we can make better bombs with heated plasma, oxygen, and tritium, then why do station nukes still use plutonium?",
|
||||
"We should port all our NT programs to modular consoles and do away with computers. They're way more customizable, support cross-platform usage, and would allow crazy amounts of multitasking.",
|
||||
"Wait, if we use more manipulators in something, then it prints for cheaper, right? So what if we just made a new type of printer that has like 12 manipulators inside of it to print stuff for really cheap?"
|
||||
))
|
||||
GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put a webserver that's automatically turned on with default admin passwords into every PDA?",
|
||||
"So like, you know how we separate our codebase from the master copy that runs on our consumer boxes? What if we merged the two and undid the separation between codebase and server?",
|
||||
"Dude, radical idea: H.O.N.K mechs but with no bananium required.",
|
||||
"Best idea ever: Disposal pipes instead of hallways."))
|
||||
"So like, you know how we separate our codebase from the master copy that runs on our consumer boxes? What if we merged the two and undid the separation between codebase and server?",
|
||||
"Dude, radical idea: H.O.N.K mechs but with no bananium required.",
|
||||
"Best idea ever: Disposal pipes instead of hallways.",
|
||||
"What if we use a language that was written on a napkin and created over 1 weekend for all of our servers?",
|
||||
"What if we took a locker, some random trash, and made an exosuit out of it? Wouldn't that be like, super cool and stuff?",
|
||||
"Okay, hear me out, what if we make illegal things not illegal, so that sec stops arresting us for having it?",
|
||||
"I have a crazy idea, guys. Rather than having monkeys to test on, what if we only used apes?",
|
||||
"Woh man ok, what if we took slime cores and smashed them into other slimes, be kinda cool to see what happens.",
|
||||
"We're NANOtrasen but we need to unlock nano parts, what's the deal with that?"
|
||||
))
|
||||
|
||||
//this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc..
|
||||
/mob/living/carbon/handle_status_effects()
|
||||
|
||||
@@ -563,7 +563,7 @@
|
||||
SetAllImmobility(0, FALSE)
|
||||
SetSleeping(0, FALSE)
|
||||
radiation = 0
|
||||
nutrition = NUTRITION_LEVEL_FED + 50
|
||||
set_nutrition(NUTRITION_LEVEL_FED + 50)
|
||||
bodytemperature = BODYTEMP_NORMAL
|
||||
set_blindness(0)
|
||||
set_blurriness(0)
|
||||
|
||||
@@ -3,122 +3,7 @@
|
||||
real_name = "Cyborg"
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "robot"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
bubble_icon = "robot"
|
||||
designation = "Default" //used for displaying the prefix & getting the current module of cyborg
|
||||
has_limbs = 1
|
||||
hud_type = /datum/hud/robot
|
||||
|
||||
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
|
||||
|
||||
var/custom_name = ""
|
||||
var/braintype = "Cyborg"
|
||||
var/obj/item/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of..
|
||||
var/obj/item/mmi/mmi = null
|
||||
|
||||
var/shell = FALSE
|
||||
var/deployed = FALSE
|
||||
var/mob/living/silicon/ai/mainframe = null
|
||||
var/datum/action/innate/undeployment/undeployment_action = new
|
||||
|
||||
//Hud stuff
|
||||
|
||||
var/obj/screen/inv1 = null
|
||||
var/obj/screen/inv2 = null
|
||||
var/obj/screen/inv3 = null
|
||||
var/obj/screen/lamp_button = null
|
||||
var/obj/screen/thruster_button = null
|
||||
var/obj/screen/hands = null
|
||||
|
||||
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
|
||||
var/obj/screen/robot_modules_background
|
||||
|
||||
//3 Modules can be activated at any one time.
|
||||
var/obj/item/robot_module/module = null
|
||||
var/obj/item/module_active = null
|
||||
held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do!
|
||||
|
||||
var/mutable_appearance/eye_lights
|
||||
|
||||
var/mob/living/silicon/ai/connected_ai = null
|
||||
var/obj/item/stock_parts/cell/cell = null
|
||||
|
||||
var/opened = 0
|
||||
var/emagged = FALSE
|
||||
var/emag_cooldown = 0
|
||||
var/wiresexposed = 0
|
||||
|
||||
var/ident = 0
|
||||
var/locked = TRUE
|
||||
var/list/req_access = list(ACCESS_ROBOTICS)
|
||||
|
||||
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
|
||||
|
||||
var/speed = 0 // VTEC speed boost.
|
||||
var/magpulse = FALSE // Magboot-like effect.
|
||||
var/ionpulse = FALSE // Jetpack-like effect.
|
||||
var/ionpulse_on = FALSE // Jetpack-like effect.
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect.
|
||||
|
||||
var/low_power_mode = 0 //whether the robot has no charge left.
|
||||
var/datum/effect_system/spark_spread/spark_system // So they can initialize sparks whenever/N
|
||||
|
||||
var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default
|
||||
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
|
||||
var/locked_down //Boolean of whether the borg is locked down or not
|
||||
|
||||
var/toner = 0
|
||||
var/tonermax = 40
|
||||
|
||||
var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
|
||||
var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
|
||||
light_color = "#FFCC66"
|
||||
light_power = 0.8
|
||||
var/lamp_cooldown = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
|
||||
|
||||
var/sight_mode = 0
|
||||
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD)
|
||||
|
||||
var/list/upgrades = list()
|
||||
|
||||
var/hasExpanded = FALSE
|
||||
var/obj/item/hat
|
||||
var/hat_offset = -3
|
||||
var/list/equippable_hats = list(/obj/item/clothing/head/caphat,
|
||||
/obj/item/clothing/head/hardhat,
|
||||
/obj/item/clothing/head/centhat,
|
||||
/obj/item/clothing/head/HoS,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/head/kitty,
|
||||
/obj/item/clothing/head/hopcap,
|
||||
/obj/item/clothing/head/wizard,
|
||||
/obj/item/clothing/head/nursehat,
|
||||
/obj/item/clothing/head/sombrero,
|
||||
/obj/item/clothing/head/helmet/chaplain/witchunter_hat,
|
||||
/obj/item/clothing/head/soft/, //All baseball caps
|
||||
/obj/item/clothing/head/that, //top hat
|
||||
/obj/item/clothing/head/collectable/tophat, //Not sure where this one is found, but it looks the same so might as well include
|
||||
/obj/item/clothing/mask/bandana/, //All bandanas (which only work in hat mode)
|
||||
/obj/item/clothing/head/fedora,
|
||||
/obj/item/clothing/head/beanie/, //All beanies
|
||||
/obj/item/clothing/ears/headphones,
|
||||
/obj/item/clothing/head/helmet/skull,
|
||||
/obj/item/clothing/head/crown/fancy)
|
||||
|
||||
can_buckle = TRUE
|
||||
buckle_lying = FALSE
|
||||
var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human)
|
||||
|
||||
var/sitting = 0
|
||||
var/bellyup = 0
|
||||
var/dogborg = FALSE
|
||||
|
||||
var/cansprint = 1
|
||||
|
||||
var/orebox = null
|
||||
|
||||
/mob/living/silicon/robot
|
||||
|
||||
/mob/living/silicon/robot/get_cell()
|
||||
return cell
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
|
||||
/mob/living/silicon/robot
|
||||
designation = "Default" //used for displaying the prefix & getting the current module of cyborg
|
||||
has_limbs = TRUE
|
||||
hud_type = /datum/hud/robot
|
||||
|
||||
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
|
||||
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
|
||||
var/custom_name = ""
|
||||
var/braintype = "Cyborg"
|
||||
var/obj/item/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of..
|
||||
var/obj/item/mmi/mmi = null
|
||||
|
||||
var/shell = FALSE
|
||||
var/deployed = FALSE
|
||||
var/mob/living/silicon/ai/mainframe = null
|
||||
var/datum/action/innate/undeployment/undeployment_action = new
|
||||
|
||||
//Hud stuff
|
||||
|
||||
var/obj/screen/inv1 = null
|
||||
var/obj/screen/inv2 = null
|
||||
var/obj/screen/inv3 = null
|
||||
var/obj/screen/lamp_button = null
|
||||
var/obj/screen/thruster_button = null
|
||||
var/obj/screen/hands = null
|
||||
|
||||
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
|
||||
var/obj/screen/robot_modules_background
|
||||
|
||||
//3 Modules can be activated at any one time.
|
||||
var/obj/item/robot_module/module = null
|
||||
var/obj/item/module_active = null
|
||||
held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do!
|
||||
|
||||
var/mutable_appearance/eye_lights
|
||||
|
||||
var/mob/living/silicon/ai/connected_ai = null
|
||||
var/obj/item/stock_parts/cell/cell = null
|
||||
|
||||
var/opened = 0
|
||||
var/emagged = FALSE
|
||||
var/emag_cooldown = 0
|
||||
var/wiresexposed = 0
|
||||
|
||||
var/ident = 0
|
||||
var/locked = TRUE
|
||||
var/list/req_access = list(ACCESS_ROBOTICS)
|
||||
|
||||
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
|
||||
|
||||
var/speed = 0 // VTEC speed boost.
|
||||
var/magpulse = FALSE // Magboot-like effect.
|
||||
var/ionpulse = FALSE // Jetpack-like effect.
|
||||
var/ionpulse_on = FALSE // Jetpack-like effect.
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect.
|
||||
|
||||
var/low_power_mode = 0 //whether the robot has no charge left.
|
||||
var/datum/effect_system/spark_spread/spark_system // So they can initialize sparks whenever/N
|
||||
|
||||
var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default
|
||||
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
|
||||
var/locked_down //Boolean of whether the borg is locked down or not
|
||||
|
||||
var/toner = 0
|
||||
var/tonermax = 40
|
||||
|
||||
var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
|
||||
var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
|
||||
light_color = "#FFCC66"
|
||||
light_power = 0.8
|
||||
var/lamp_cooldown = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
|
||||
|
||||
var/sight_mode = 0
|
||||
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD)
|
||||
|
||||
var/list/upgrades = list()
|
||||
|
||||
var/hasExpanded = FALSE
|
||||
var/obj/item/hat
|
||||
var/hat_offset = -3
|
||||
var/list/equippable_hats = list(/obj/item/clothing/head/caphat,
|
||||
/obj/item/clothing/head/hardhat,
|
||||
/obj/item/clothing/head/centhat,
|
||||
/obj/item/clothing/head/HoS,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/head/kitty,
|
||||
/obj/item/clothing/head/hopcap,
|
||||
/obj/item/clothing/head/wizard,
|
||||
/obj/item/clothing/head/nursehat,
|
||||
/obj/item/clothing/head/sombrero,
|
||||
/obj/item/clothing/head/helmet/chaplain/witchunter_hat,
|
||||
/obj/item/clothing/head/soft/, //All baseball caps
|
||||
/obj/item/clothing/head/that, //top hat
|
||||
/obj/item/clothing/head/collectable/tophat, //Not sure where this one is found, but it looks the same so might as well include
|
||||
/obj/item/clothing/mask/bandana/, //All bandanas (which only work in hat mode)
|
||||
/obj/item/clothing/head/fedora,
|
||||
/obj/item/clothing/head/beanie/, //All beanies
|
||||
/obj/item/clothing/ears/headphones,
|
||||
/obj/item/clothing/head/helmet/skull,
|
||||
/obj/item/clothing/head/crown/fancy)
|
||||
|
||||
can_buckle = TRUE
|
||||
buckle_lying = FALSE
|
||||
var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human)
|
||||
|
||||
var/sitting = 0
|
||||
var/bellyup = 0
|
||||
var/dogborg = FALSE
|
||||
|
||||
var/cansprint = 1
|
||||
|
||||
var/orebox = null
|
||||
|
||||
//doggie borg stuff.
|
||||
var/disabler
|
||||
var/laser
|
||||
var/sleeper_g
|
||||
var/sleeper_r
|
||||
var/sleeper_nv
|
||||
@@ -769,9 +769,9 @@
|
||||
/obj/item/toy/crayon/spraycan/borg,
|
||||
/obj/item/hand_labeler/borg,
|
||||
/obj/item/razor,
|
||||
/obj/item/rsf,
|
||||
/obj/item/instrument/violin,
|
||||
/obj/item/instrument/guitar,
|
||||
/obj/item/rsf/cyborg,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/lighter,
|
||||
/obj/item/storage/bag/tray,
|
||||
|
||||
@@ -55,8 +55,9 @@
|
||||
if(isclosedturf(T))
|
||||
continue
|
||||
possible_ends |= T
|
||||
var/turf/end = pick(possible_ends)
|
||||
do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
|
||||
if(length(possible_ends))
|
||||
var/turf/end = pick(possible_ends)
|
||||
do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
|
||||
SLEEP_CHECK_DEATH(8)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
..(gibbed)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot()
|
||||
butcher_results[crusher_loot] = 1
|
||||
LAZYSET(butcher_results, crusher_loot, 1)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
|
||||
if(bodytemperature < minbodytemp)
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
Feedstop(0, 0)
|
||||
return
|
||||
|
||||
add_nutrition((rand(7, 15) * CONFIG_GET(number/damage_multiplier)))
|
||||
adjust_nutrition((rand(7, 15) * CONFIG_GET(number/damage_multiplier)), get_max_nutrition(), TRUE)
|
||||
|
||||
//Heal yourself.
|
||||
adjustBruteLoss(-3)
|
||||
@@ -244,15 +244,13 @@
|
||||
return
|
||||
|
||||
if(prob(15))
|
||||
nutrition -= 1 + is_adult
|
||||
adjust_nutrition(-1 - is_adult)
|
||||
|
||||
if(nutrition <= 0)
|
||||
nutrition = 0
|
||||
if(prob(75))
|
||||
adjustBruteLoss(rand(0,5))
|
||||
if(nutrition <= 0 && prob(75))
|
||||
adjustBruteLoss(rand(0,5))
|
||||
|
||||
else if (nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD)
|
||||
nutrition -= 20
|
||||
adjust_nutrition(-20)
|
||||
amount_grown++
|
||||
update_action_buttons_icon()
|
||||
|
||||
@@ -262,9 +260,11 @@
|
||||
else
|
||||
Evolve()
|
||||
|
||||
/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0)
|
||||
nutrition = min((nutrition + nutrition_to_add), get_max_nutrition())
|
||||
if(nutrition >= get_grow_nutrition())
|
||||
/mob/living/simple_animal/slime/adjust_nutrition(change, max = INFINITY, slime_check = FALSE)
|
||||
. = ..()
|
||||
if(!slime_check)
|
||||
return
|
||||
if(nutrition == max)
|
||||
if(powerlevel<10)
|
||||
if(prob(30-powerlevel*2))
|
||||
powerlevel++
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
var/mob/living/simple_animal/slime/M
|
||||
M = new(loc, child_colour)
|
||||
if(ckey)
|
||||
M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature!
|
||||
M.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature!
|
||||
M.powerlevel = new_powerlevel
|
||||
if(i != 1)
|
||||
step_away(M,src)
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
healable = 0
|
||||
gender = NEUTER
|
||||
blood_volume = 0 //Until someome reworks for them to have slime jelly
|
||||
nutrition = 700
|
||||
|
||||
see_in_dark = 8
|
||||
|
||||
@@ -102,7 +103,6 @@
|
||||
create_reagents(100, NONE, NO_REAGENTS_VALUE)
|
||||
set_colour(new_colour)
|
||||
. = ..()
|
||||
nutrition = 700
|
||||
|
||||
/mob/living/simple_animal/slime/Destroy()
|
||||
for (var/A in actions)
|
||||
@@ -267,8 +267,8 @@
|
||||
return
|
||||
attacked += 5
|
||||
if(nutrition >= 100) //steal some nutrition. negval handled in life()
|
||||
nutrition -= (50 + (40 * M.is_adult))
|
||||
M.add_nutrition(50 + (40 * M.is_adult))
|
||||
adjust_nutrition(-50 - (40 * M.is_adult))
|
||||
M.adjust_nutrition(50 + (40 * M.is_adult), get_max_nutrition(), TRUE)
|
||||
if(health > 0)
|
||||
M.adjustBruteLoss(-10 + (-10 * M.is_adult))
|
||||
M.updatehealth()
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
continue
|
||||
var/datum/atom_hud/alternate_appearance/AA = v
|
||||
AA.onNewMob(src)
|
||||
nutrition = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX)
|
||||
set_nutrition(rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX))
|
||||
. = ..()
|
||||
update_config_movespeed()
|
||||
update_movespeed(TRUE)
|
||||
@@ -1023,6 +1023,14 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
|
||||
var/datum/language_holder/H = get_language_holder()
|
||||
H.open_language_menu(usr)
|
||||
|
||||
///Adjust the nutrition of a mob
|
||||
/mob/proc/adjust_nutrition(change, max = INFINITY) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks
|
||||
nutrition = clamp(0, nutrition + change, max)
|
||||
|
||||
///Force set the mob nutrition
|
||||
/mob/proc/set_nutrition(var/change) //Seriously fuck you oldcoders.
|
||||
nutrition = max(0, change)
|
||||
|
||||
/mob/setMovetype(newval)
|
||||
. = ..()
|
||||
update_movespeed(FALSE)
|
||||
|
||||
@@ -459,7 +459,7 @@
|
||||
var/list/babies = list()
|
||||
for(var/i=1,i<=number,i++)
|
||||
var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc)
|
||||
M.nutrition = round(nutrition/number)
|
||||
M.set_nutrition(round(nutrition/number))
|
||||
step_away(M,src)
|
||||
babies += M
|
||||
new_slime = pick(babies)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user