Coonflict fiiixeeess

This commit is contained in:
Artur
2020-05-13 12:56:17 +03:00
261 changed files with 3312 additions and 1483 deletions
+12
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+13 -11
View File
@@ -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)
+2 -2
View File
@@ -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)
+33 -4
View File
@@ -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")
+1
View File
@@ -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)
+24 -14
View File
@@ -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)
+9 -2
View File
@@ -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)
+8 -4
View File
@@ -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)
+2 -3
View File
@@ -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)
+5 -5
View File
@@ -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
+9 -1
View File
@@ -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
+2 -2
View File
@@ -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", \
+2
View File
@@ -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()
. = ..()
+2
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+36
View File
@@ -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//
//////////////////////////////////
+11 -4
View File
@@ -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
View File
@@ -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
+1
View File
@@ -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"
+2
View File
@@ -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"
+2
View File
@@ -0,0 +1,2 @@
/obj/item/proc/get_item_credit_value()
return
+120
View File
@@ -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
+138
View File
@@ -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>"
+26 -19
View File
@@ -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
+3 -1
View File
@@ -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"
+17 -2
View File
@@ -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)
+2
View File
@@ -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)
+2
View File
@@ -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
+2
View File
@@ -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
+4
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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)
+2
View File
@@ -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)
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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)
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -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)
+2
View File
@@ -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
+3
View File
@@ -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
+1 -2
View File
@@ -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
+1 -1
View File
@@ -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)
+3
View File
@@ -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))
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"
+17 -5
View File
@@ -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()
+1 -1
View File
@@ -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()
+9 -1
View File
@@ -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)
+1 -1
View File
@@ -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