Merge branch 'stock_market' of https://github.com/GhostActual/VOREStation into stock_market
@@ -1,6 +1,14 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"gbasood.byond-dm-language-support",
|
||||
"platymuus.dm-langclient"
|
||||
]
|
||||
"gbasood.byond-dm-language-support",
|
||||
"platymuus.dm-langclient",
|
||||
"stylemistake.auto-comment-blocks",
|
||||
"eamodio.gitlens",
|
||||
"oderwat.indent-rainbow",
|
||||
"rexebin.darkpurple-black",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"editorconfig.editorconfig",
|
||||
"donkie.vscode-tgstation-test-adapter",
|
||||
"icrawl.discord-vscode"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#define CE_SPEEDBOOST "gofast" // Hyperzine
|
||||
#define CE_SLOWDOWN "goslow" // Slowdown
|
||||
#define CE_ANTACID "nopuke" // Don't puke.
|
||||
#define CE_ALLERGEN "allergyreaction" // Self explanatory
|
||||
|
||||
#define REAGENTS_PER_SHEET 20
|
||||
|
||||
@@ -46,7 +47,7 @@
|
||||
|
||||
// Chemistry lists.
|
||||
var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine") // Increase heart rate.
|
||||
var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") // Decrease heart rate.
|
||||
var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "bliss", "stoxin", "ambrosia_extract") // Decrease heart rate.
|
||||
var/list/heartstopper = list("potassium_chlorophoride", "zombie_powder") // This stops the heart.
|
||||
var/list/cheartstopper = list("potassium_chloride") // This stops the heart when overdose is met. -- c = conditional
|
||||
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
// Sorted alphabetically
|
||||
// Shamelessly yoinked from TGCode, luv u folks
|
||||
#define span_abductor(str) ("<span class='abductor'>" + str + "</span>")
|
||||
#define span_admin(str) ("<span class='admin'>" + str + "</span>")
|
||||
#define span_adminhelp(str) ("<span class='adminhelp'>" + str + "</span>")
|
||||
#define span_adminnotice(str) ("<span class='adminnotice'>" + str + "</span>")
|
||||
#define span_adminobserverooc(str) ("<span class='adminobserverooc'>" + str + "</span>")
|
||||
#define span_adminooc(str) ("<span class='adminooc'>" + str + "</span>")
|
||||
#define span_adminsay(str) ("<span class='adminsay'>" + str + "</span>")
|
||||
#define span_aiprivradio(str) ("<span class='aiprivradio'>" + str + "</span>")
|
||||
#define span_alert(str) ("<span class='alert'>" + str + "</span>")
|
||||
#define span_alertalien(str) ("<span class='alertalien'>" + str + "</span>")
|
||||
#define span_alertsyndie(str) ("<span class='alertsyndie'>" + str + "</span>")
|
||||
#define span_alertwarning(str) ("<span class='alertwarning'>" + str + "</span>")
|
||||
#define span_alien(str) ("<span class='alien'>" + str + "</span>")
|
||||
#define span_announce(str) ("<span class='announce'>" + str + "</span>")
|
||||
#define span_big(str) ("<span class='big'>" + str + "</span>")
|
||||
#define span_bigicon(str) ("<span class='bigicon'>" + str + "</span>")
|
||||
#define span_binarysay(str) ("<span class='binarysay'>" + str + "</span>")
|
||||
#define span_blue(str) ("<span class='blue'>" + str + "</span>")
|
||||
#define span_blueteamradio(str) ("<span class='blueteamradio'>" + str + "</span>")
|
||||
#define span_bold(str) ("<span class='bold'>" + str + "</span>")
|
||||
#define span_boldannounce(str) ("<span class='boldannounce'>" + str + "</span>")
|
||||
#define span_boldnotice(str) ("<span class='boldnotice'>" + str + "</span>")
|
||||
#define span_boldwarning(str) ("<span class='boldwarning'>" + str + "</span>")
|
||||
#define span_centcomradio(str) ("<span class='centcomradio'>" + str + "</span>")
|
||||
#define span_changeling(str) ("<span class='changeling'>" + str + "</span>")
|
||||
#define span_clown(str) ("<span class='clown'>" + str + "</span>")
|
||||
#define span_colossus(str) ("<span class='colossus'>" + str + "</span>")
|
||||
#define span_command_headset(str) ("<span class='command_headset'>" + str + "</span>")
|
||||
#define span_comradio(str) ("<span class='comradio'>" + str + "</span>")
|
||||
#define span_cult(str) ("<span class='cult'>" + str + "</span>")
|
||||
#define span_cultbold(str) ("<span class='cultbold'>" + str + "</span>")
|
||||
#define span_cultboldtalic(str) ("<span class='cultboldtalic'>" + str + "</span>")
|
||||
#define span_cultitalic(str) ("<span class='cultitalic'>" + str + "</span>")
|
||||
#define span_cultlarge(str) ("<span class='cultlarge'>" + str + "</span>")
|
||||
#define span_danger(str) ("<span class='danger'>" + str + "</span>")
|
||||
#define span_deadsay(str) ("<span class='deadsay'>" + str + "</span>")
|
||||
#define span_deconversion_message(str) ("<span class='deconversion_message'>" + str + "</span>")
|
||||
#define span_drone(str) ("<span class='drone'>" + str + "</span>")
|
||||
#define span_engradio(str) ("<span class='engradio'>" + str + "</span>")
|
||||
#define span_extremelybig(str) ("<span class='extremelybig'>" + str + "</span>")
|
||||
#define span_ghostalert(str) ("<span class='ghostalert'>" + str + "</span>")
|
||||
#define span_green(str) ("<span class='green'>" + str + "</span>")
|
||||
#define span_greenannounce(str) ("<span class='greenannounce'>" + str + "</span>")
|
||||
#define span_greenteamradio(str) ("<span class='greenteamradio'>" + str + "</span>")
|
||||
#define span_greentext(str) ("<span class='greentext'>" + str + "</span>")
|
||||
#define span_hear(str) ("<span class='hear'>" + str + "</span>")
|
||||
#define span_hidden(str) ("<span class='hidden'>" + str + "</span>")
|
||||
#define span_hierophant(str) ("<span class='hierophant'>" + str + "</span>")
|
||||
#define span_hierophant_warning(str) ("<span class='hierophant_warning'>" + str + "</span>")
|
||||
#define span_highlight(str) ("<span class='highlight'>" + str + "</span>")
|
||||
#define span_his_grace(str) ("<span class='his_grace'>" + str + "</span>")
|
||||
#define span_holoparasite(str) ("<span class='holoparasite'>" + str + "</span>")
|
||||
#define span_hypnophrase(str) ("<span class='hypnophrase'>" + str + "</span>")
|
||||
#define span_icon(str) ("<span class='icon'>" + str + "</span>")
|
||||
#define span_info(str) ("<span class='info'>" + str + "</span>")
|
||||
#define span_interface(str) ("<span class='interface'>" + str + "</span>")
|
||||
#define span_looc(str) ("<span class='looc'>" + str + "</span>")
|
||||
#define span_medal(str) ("<span class='medal'>" + str + "</span>")
|
||||
#define span_medradio(str) ("<span class='medradio'>" + str + "</span>")
|
||||
#define span_memo(str) ("<span class='memo'>" + str + "</span>")
|
||||
#define span_memoedit(str) ("<span class='memoedit'>" + str + "</span>")
|
||||
#define span_mind_control(str) ("<span class='mind_control'>" + str + "</span>")
|
||||
#define span_minorannounce(str) ("<span class='minorannounce'>" + str + "</span>")
|
||||
#define span_monkey(str) ("<span class='monkey'>" + str + "</span>")
|
||||
#define span_monkeyhive(str) ("<span class='monkeyhive'>" + str + "</span>")
|
||||
#define span_monkeylead(str) ("<span class='monkeylead'>" + str + "</span>")
|
||||
#define span_name(str) ("<span class='name'>" + str + "</span>")
|
||||
#define span_narsie(str) ("<span class='narsie'>" + str + "</span>")
|
||||
#define span_narsiesmall(str) ("<span class='narsiesmall'>" + str + "</span>")
|
||||
#define span_nicegreen(str) ("<span class='nicegreen'>" + str + "</span>")
|
||||
#define span_notice(str) ("<span class='notice'>" + str + "</span>")
|
||||
#define span_noticealien(str) ("<span class='noticealien'>" + str + "</span>")
|
||||
#define span_ooc(str) ("<span class='ooc'>" + str + "</span>")
|
||||
#define span_papyrus(str) ("<span class='papyrus'>" + str + "</span>")
|
||||
#define span_phobia(str) ("<span class='phobia'>" + str + "</span>")
|
||||
#define span_prefix(str) ("<span class='prefix'>" + str + "</span>")
|
||||
#define span_purple(str) ("<span class='purple'>" + str + "</span>")
|
||||
#define span_radio(str) ("<span class='radio'>" + str + "</span>")
|
||||
#define span_reallybig(str) ("<span class='reallybig'>" + str + "</span>")
|
||||
#define span_red(str) ("<span class='red'>" + str + "</span>")
|
||||
#define span_redteamradio(str) ("<span class='redteamradio'>" + str + "</span>")
|
||||
#define span_redtext(str) ("<span class='redtext'>" + str + "</span>")
|
||||
#define span_resonate(str) ("<span class='resonate'>" + str + "</span>")
|
||||
#define span_revenbignotice(str) ("<span class='revenbignotice'>" + str + "</span>")
|
||||
#define span_revenboldnotice(str) ("<span class='revenboldnotice'>" + str + "</span>")
|
||||
#define span_revendanger(str) ("<span class='revendanger'>" + str + "</span>")
|
||||
#define span_revenminor(str) ("<span class='revenminor'>" + str + "</span>")
|
||||
#define span_revennotice(str) ("<span class='revennotice'>" + str + "</span>")
|
||||
#define span_revenwarning(str) ("<span class='revenwarning'>" + str + "</span>")
|
||||
#define span_robot(str) ("<span class='robot'>" + str + "</span>")
|
||||
#define span_rose(str) ("<span class='rose'>" + str + "</span>")
|
||||
#define span_sans(str) ("<span class='sans'>" + str + "</span>")
|
||||
#define span_sciradio(str) ("<span class='sciradio'>" + str + "</span>")
|
||||
#define span_secradio(str) ("<span class='secradio'>" + str + "</span>")
|
||||
#define span_servradio(str) ("<span class='servradio'>" + str + "</span>")
|
||||
#define span_singing(str) ("<span class='singing'>" + str + "</span>")
|
||||
#define span_slime(str) ("<span class='slime'>" + str + "</span>")
|
||||
#define span_small(str) ("<span class='small'>" + str + "</span>")
|
||||
#define span_smallnotice(str) ("<span class='smallnotice'>" + str + "</span>")
|
||||
#define span_smallnoticeital(str) ("<span class='smallnoticeital'>" + str + "</span>")
|
||||
#define span_spider(str) ("<span class='spider'>" + str + "</span>")
|
||||
#define span_suicide(str) ("<span class='suicide'>" + str + "</span>")
|
||||
#define span_suppradio(str) ("<span class='suppradio'>" + str + "</span>")
|
||||
#define span_swarmer(str) ("<span class='swarmer'>" + str + "</span>")
|
||||
#define span_syndradio(str) ("<span class='syndradio'>" + str + "</span>")
|
||||
#define span_tape_recorder(str) ("<span class='tape_recorder'>" + str + "</span>")
|
||||
#define span_tinynotice(str) ("<span class='tinynotice'>" + str + "</span>")
|
||||
#define span_tinynoticeital(str) ("<span class='tinynoticeital'>" + str + "</span>")
|
||||
#define span_unconscious(str) ("<span class='unconscious'>" + str + "</span>")
|
||||
#define span_userdanger(str) ("<span class='userdanger'>" + str + "</span>")
|
||||
#define span_warning(str) ("<span class='warning'>" + str + "</span>")
|
||||
#define span_yell(str) ("<span class='yell'>" + str + "</span>")
|
||||
#define span_yellowteamradio(str) ("<span class='yellowteamradio'>" + str + "</span>"
|
||||
|
||||
// VORE Specific stuff after this point
|
||||
// Sorted by however I felt like it
|
||||
#define span_game_say(str) ("<span class='game_say'>" + str + "</span>"
|
||||
#define span_emote_subtle(str) ("<span class='emote_subtle'>" + str + "</span>"
|
||||
#define span_emote(str) ("<span class='emote'>" + str + "</span>"
|
||||
@@ -40,14 +40,16 @@
|
||||
#define ALLERGEN_STIMULANT 0x1000 // Stimulants are what makes the Tajaran heart go ruh roh - not just coffee!
|
||||
|
||||
// Allergen reactions
|
||||
#define AG_TOX_DMG 0x1 // the classic
|
||||
#define AG_OXY_DMG 0x2 // intense airway reactions
|
||||
#define AG_EMOTE 0x4 // general emote reactions based on affect type
|
||||
#define AG_PAIN 0x8 // short-lived hurt
|
||||
#define AG_WEAKEN 0x10 // too weak to move, oof
|
||||
#define AG_BLURRY 0x20 // blurred vision!
|
||||
#define AG_SLEEPY 0x40 // fatigue/exhaustion
|
||||
#define AG_CONFUSE 0x80 // disorientation - VOREStation addition
|
||||
#define AG_PHYS_DMG 0x1 // brute
|
||||
#define AG_BURN_DMG 0x2 // burns
|
||||
#define AG_TOX_DMG 0x4 // the classic
|
||||
#define AG_OXY_DMG 0x8 // intense airway reactions
|
||||
#define AG_EMOTE 0x10 // general emote reactions based on affect type
|
||||
#define AG_PAIN 0x20 // short-lived hurt
|
||||
#define AG_WEAKEN 0x40 // too weak to move, oof
|
||||
#define AG_BLURRY 0x80 // blurred vision!
|
||||
#define AG_SLEEPY 0x100 // fatigue/exhaustion
|
||||
#define AG_CONFUSE 0x200 // disorientation
|
||||
|
||||
// Species spawn flags
|
||||
#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play.
|
||||
|
||||
@@ -1,10 +1,20 @@
|
||||
// Returns the atom sitting on the turf.
|
||||
// For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf.
|
||||
/proc/get_atom_on_turf(var/atom/movable/M)
|
||||
var/atom/mloc = M
|
||||
while(mloc && mloc.loc && !istype(mloc.loc, /turf/))
|
||||
mloc = mloc.loc
|
||||
return mloc
|
||||
/**
|
||||
* Returns a best attempt at the least-nested containing movable of subject, or subject.
|
||||
* eg, if subject is an item in a bag on a mob in a locker in the world, returns the locker.
|
||||
*/
|
||||
/proc/get_atom_on_turf(atom/movable/subject)
|
||||
var/atom/parent = subject?.loc
|
||||
if (!parent || !ismovable(subject) || isarea(parent))
|
||||
return subject
|
||||
var/atom/current = subject
|
||||
do
|
||||
parent = current.loc
|
||||
if (isturf(parent))
|
||||
return current
|
||||
current = parent
|
||||
while (current)
|
||||
return subject
|
||||
|
||||
|
||||
/proc/iswall(turf/T)
|
||||
return (istype(T, /turf/simulated/wall) || istype(T, /turf/unsimulated/wall) || istype(T, /turf/simulated/shuttle/wall))
|
||||
|
||||
@@ -196,4 +196,14 @@
|
||||
/datum/category_item/underwear/undershirt/sleevelessturtle
|
||||
name = "Turtleneck, Sleeveless"
|
||||
icon_state = "sleevelessturtle"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/dress_shirt_fem
|
||||
name = "Dress shirt, feminine"
|
||||
icon_state = "undershirt_dress_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/dress_shirt
|
||||
name = "Dress shirt, masculine"
|
||||
icon_state = "undershirt_dress"
|
||||
has_color = TRUE
|
||||
@@ -1081,8 +1081,8 @@ datum
|
||||
return 0
|
||||
|
||||
drugs
|
||||
steal_target = /datum/reagent/space_drugs
|
||||
explanation_text = "Steal some space drugs."
|
||||
steal_target = /datum/reagent/drugs/bliss
|
||||
explanation_text = "Steal some bliss."
|
||||
weight = 40
|
||||
|
||||
get_points(var/job)
|
||||
|
||||
@@ -101,8 +101,9 @@
|
||||
BIOGEN_ITEM("Winter Coat", /obj/item/clothing/suit/storage/hooded/wintercoat, 1, 500),
|
||||
//VOREStation Edit - Algae for oxygen generator
|
||||
BIOGEN_ITEM("4 Algae Sheets", /obj/item/stack/material/algae, 4, 400),
|
||||
BIOGEN_ITEM("50 Algae Sheets", /obj/item/stack/material/algae, 50, 5000),
|
||||
)
|
||||
|
||||
|
||||
/obj/machinery/biogenerator/tgui_static_data(mob/user)
|
||||
var/list/static_data[0]
|
||||
|
||||
@@ -155,7 +156,7 @@
|
||||
|
||||
if(!(category in item_list) || !(name in item_list[category])) // Not trying something that's not in the list, are you?
|
||||
return
|
||||
|
||||
|
||||
var/datum/data/biogenerator_item/bi = item_list[category][name]
|
||||
if(!istype(bi))
|
||||
var/datum/data/biogenerator_reagent/br = item_list[category][name]
|
||||
@@ -175,7 +176,7 @@
|
||||
beaker.reagents.add_reagent(br.reagent_id, amt_to_actually_dispense)
|
||||
playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1)
|
||||
return
|
||||
|
||||
|
||||
var/cost = round(bi.cost / build_eff)
|
||||
if(cost > points)
|
||||
to_chat(usr, "<span class='danger'>Insufficient biomass.</span>")
|
||||
|
||||
@@ -1,85 +1,41 @@
|
||||
#define CHARGER_EMPTY 0
|
||||
#define CHARGER_WORKING 1
|
||||
#define CHARGER_DONE 2
|
||||
|
||||
/obj/machinery/cell_charger
|
||||
name = "heavy-duty cell charger"
|
||||
desc = "A much more powerful version of the standard recharger that is specially designed for charging power cells."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "recharger"
|
||||
anchored = TRUE
|
||||
icon_state = "ccharger0"
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
power_channel = EQUIP
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 60000 //60 kW. (this the power drawn when charging)
|
||||
circuit = /obj/item/weapon/circuitboard/cell_charger
|
||||
|
||||
var/efficiency = 60000 //will provide the modified power rate when upgraded
|
||||
power_channel = EQUIP
|
||||
var/obj/item/weapon/cell/charging = null
|
||||
var/charging_vis_flags = NONE
|
||||
var/charge_state = CHARGER_EMPTY
|
||||
var/chargelevel = -1
|
||||
circuit = /obj/item/weapon/circuitboard/cell_charger
|
||||
|
||||
/obj/machinery/cell_charger/Initialize()
|
||||
. = ..()
|
||||
default_apply_parts()
|
||||
|
||||
/obj/machinery/cell_charger/update_icon()
|
||||
var/new_state
|
||||
icon_state = "ccharger[charging ? 1 : 0]"
|
||||
|
||||
if(!anchored)
|
||||
new_state = "[initial(icon_state)]4"
|
||||
return
|
||||
icon_state = "ccharger2"
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
new_state = "[initial(icon_state)]3"
|
||||
return
|
||||
if(charging && !(stat & (BROKEN|NOPOWER)))
|
||||
|
||||
switch(charge_state)
|
||||
if(CHARGER_EMPTY)
|
||||
new_state = "[initial(icon_state)]0"
|
||||
if(CHARGER_WORKING)
|
||||
new_state = "[initial(icon_state)]1"
|
||||
if(CHARGER_DONE)
|
||||
new_state = "[initial(icon_state)]2"
|
||||
|
||||
if(icon_state != new_state)
|
||||
icon_state = new_state
|
||||
var/newlevel = round(charging.percent() * 4.0 / 99)
|
||||
//to_world("nl: [newlevel]")
|
||||
|
||||
/obj/machinery/cell_charger/proc/insert_item(obj/item/W, mob/user)
|
||||
if(!W || !user)
|
||||
return
|
||||
if(chargelevel != newlevel)
|
||||
|
||||
user.drop_item()
|
||||
charging = W
|
||||
charging.loc = src
|
||||
charging_vis_flags = charging.vis_flags
|
||||
charging.vis_flags = VIS_INHERIT_ID
|
||||
vis_contents += charging
|
||||
|
||||
charge_state = CHARGER_WORKING
|
||||
update_icon()
|
||||
cut_overlays()
|
||||
add_overlay("ccharger-o[newlevel]")
|
||||
|
||||
if((stat & (BROKEN|NOPOWER)) || !anchored)
|
||||
update_use_power(USE_POWER_OFF)
|
||||
chargelevel = newlevel
|
||||
else
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
|
||||
/obj/machinery/cell_charger/proc/remove_item(mob/user)
|
||||
if(!charging || !user)
|
||||
return
|
||||
|
||||
vis_contents -= charging
|
||||
charging.vis_flags = charging_vis_flags
|
||||
user.put_in_hands(charging)
|
||||
charging = null
|
||||
|
||||
charge_state = CHARGER_EMPTY
|
||||
|
||||
if((stat & (BROKEN|NOPOWER)) || !anchored)
|
||||
update_use_power(USE_POWER_OFF)
|
||||
else
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
|
||||
update_icon()
|
||||
cut_overlays()
|
||||
|
||||
/obj/machinery/cell_charger/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -107,8 +63,11 @@
|
||||
to_chat(user, "<span class='warning'>\The [src] blinks red as you try to insert [W]!</span>")
|
||||
return
|
||||
|
||||
insert_item(W, user)
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
charging = W
|
||||
user.visible_message("[user] inserts [charging] into [src].", "You insert [charging] into [src].")
|
||||
chargelevel = -1
|
||||
update_icon()
|
||||
else if(W.is_wrench())
|
||||
if(charging)
|
||||
@@ -129,15 +88,22 @@
|
||||
add_fingerprint(user)
|
||||
|
||||
if(charging)
|
||||
remove_item(user)
|
||||
user.put_in_hands(charging)
|
||||
charging.update_icon()
|
||||
user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].")
|
||||
|
||||
charging = null
|
||||
chargelevel = -1
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/cell_charger/attack_ai(mob/user)
|
||||
if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough
|
||||
if(charging)
|
||||
remove_item(user)
|
||||
user.visible_message("[user] disconnects [charging] from [src].", "You disconnect [charging] from [src].")
|
||||
|
||||
user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].")
|
||||
charging.loc = src.loc
|
||||
charging.update_icon()
|
||||
charging = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/cell_charger/emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
@@ -146,9 +112,6 @@
|
||||
charging.emp_act(severity)
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/cell_charger/power_change()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/cell_charger/process()
|
||||
//to_world("ccpt [charging] [stat]")
|
||||
@@ -156,22 +119,16 @@
|
||||
update_use_power(USE_POWER_OFF)
|
||||
return
|
||||
|
||||
if(charging)
|
||||
if(!charging.fully_charged())
|
||||
charge_state = CHARGER_WORKING
|
||||
charging.give(efficiency*CELLRATE)
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
else
|
||||
charge_state = CHARGER_DONE
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
if(charging && !charging.fully_charged())
|
||||
charging.give(efficiency*CELLRATE)
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
|
||||
update_icon()
|
||||
else
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
|
||||
/obj/machinery/cell_charger/RefreshParts()
|
||||
var/E = 0
|
||||
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
|
||||
E += C.rating
|
||||
efficiency = active_power_usage * (1+ (E - 1)*0.5)
|
||||
|
||||
#undef CHARGER_EMPTY
|
||||
#undef CHARGER_WORKING
|
||||
#undef CHARGER_DONE
|
||||
efficiency = active_power_usage * (1+ (E - 1)*0.5)
|
||||
@@ -57,9 +57,12 @@
|
||||
health -= Proj.get_structure_damage()
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/spider/proc/die()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
qdel(src)
|
||||
die()
|
||||
|
||||
/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300 + T0C)
|
||||
@@ -148,7 +151,7 @@
|
||||
layer = HIDING_LAYER
|
||||
health = 3
|
||||
var/last_itch = 0
|
||||
var/amount_grown = -1
|
||||
var/amount_grown = 0
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
|
||||
var/travelling_in_vent = 0
|
||||
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
@@ -187,16 +190,17 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/proc/die()
|
||||
/obj/effect/spider/spiderling/die()
|
||||
visible_message("<span class='alert'>[src] dies!</span>")
|
||||
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
/obj/effect/spider/spiderling/healthcheck()
|
||||
if(health <= 0)
|
||||
die()
|
||||
|
||||
/obj/effect/spider/spiderling/process()
|
||||
healthcheck()
|
||||
if(travelling_in_vent)
|
||||
if(istype(src.loc, /turf))
|
||||
travelling_in_vent = 0
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
//Let's get some REAL contraband stuff in here. Because come on, getting brigged for LIPSTICK is no fun.
|
||||
|
||||
//Illicit drugs~
|
||||
// Let's get some REAL contraband stuff in here. Because come on, getting brigged for LIPSTICK is no fun.
|
||||
//
|
||||
// Includes drug powder.
|
||||
//
|
||||
// Illicit drugs~
|
||||
/obj/item/weapon/storage/pill_bottle/happy
|
||||
name = "bottle of Happy pills"
|
||||
desc = "Highly illegal drug. When you want to see the rainbow."
|
||||
@@ -19,7 +21,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/beaker/vial/random/toxin
|
||||
random_reagent_list = list(
|
||||
list("mindbreaker" = 10, "space_drugs" = 20) = 3,
|
||||
list("mindbreaker" = 10, "bliss" = 20) = 3,
|
||||
list("carpotoxin" = 15) = 2,
|
||||
list("impedrezene" = 15) = 2,
|
||||
list("zombiepowder" = 10) = 1)
|
||||
@@ -39,3 +41,56 @@
|
||||
|
||||
desc = "Contains [english_list(names)]."
|
||||
update_icon()
|
||||
|
||||
//
|
||||
// Drug Powder
|
||||
//
|
||||
/obj/item/weapon/reagent_containers/powder
|
||||
name = "powder"
|
||||
desc = "A powdered form of... something."
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "powder"
|
||||
item_state = "powder"
|
||||
amount_per_transfer_from_this = 2
|
||||
possible_transfer_amounts = 2
|
||||
w_class = ITEMSIZE_TINY
|
||||
volume = 50
|
||||
|
||||
/obj/item/weapon/reagent_containers/powder/examine(mob/user)
|
||||
if(reagents)
|
||||
var/datum/reagent/R = reagents.get_master_reagent()
|
||||
desc = "A powdered form of what appears to be [R.name]. There's about [reagents.total_volume] units here."
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/powder/Initialize()
|
||||
..()
|
||||
get_appearance()
|
||||
|
||||
/obj/item/weapon/reagent_containers/powder/proc/get_appearance()
|
||||
/// Names and colors based on dominant reagent.
|
||||
if (reagents.reagent_list.len > 0)
|
||||
color = reagents.get_color()
|
||||
var/datum/reagent/R = reagents.get_master_reagent()
|
||||
var/new_name = lowertext(R)
|
||||
name = "powdered [new_name]"
|
||||
|
||||
/// Snorting.
|
||||
|
||||
/obj/item/weapon/reagent_containers/powder/attackby(var/obj/item/weapon/W, var/mob/living/user)
|
||||
|
||||
if(!ishuman(user)) /// You gotta be fleshy to snort the naughty drugs.
|
||||
return ..()
|
||||
|
||||
if(!istype(W, /obj/item/weapon/glass_extra/straw) && !istype(W, /obj/item/weapon/reagent_containers/rollingpaper))
|
||||
return ..()
|
||||
|
||||
user.visible_message("<span class='warning'>[user] snorts [src] with [W]!</span>")
|
||||
playsound(loc, 'sound/effects/snort.ogg', 50, 1)
|
||||
|
||||
if(reagents)
|
||||
reagents.trans_to_mob(user, amount_per_transfer_from_this, CHEM_BLOOD)
|
||||
|
||||
if(!reagents.total_volume) /// Did we use all of it?
|
||||
qdel(src)
|
||||
|
||||
////// End powder. /////////
|
||||
@@ -144,7 +144,7 @@
|
||||
to_chat(user, "<span class='notice'>There's visible lag between left and right pupils' reactions.</span>")
|
||||
|
||||
var/list/pinpoint = list("oxycodone"=1,"tramadol"=5)
|
||||
var/list/dilating = list("space_drugs"=5,"mindbreaker"=1)
|
||||
var/list/dilating = list("bliss"=5,"ambrosia_extract"=5,"mindbreaker"=1)
|
||||
if(M.reagents.has_any_reagent(pinpoint) || H.ingested.has_any_reagent(pinpoint))
|
||||
to_chat(user, "<span class='notice'>\The [M]'s pupils are already pinpoint and cannot narrow any more.</span>")
|
||||
else if(M.reagents.has_any_reagent(dilating) || H.ingested.has_any_reagent(dilating))
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
/obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible
|
||||
if(uses_charge || S.uses_charge) // This should realistically never happen, but in case it does lets avoid breaking things.
|
||||
return
|
||||
if(S.stacktype != stacktype)
|
||||
return
|
||||
if(S.amount >= S.max_amount)
|
||||
return
|
||||
|
||||
var/transfer = get_amount()
|
||||
transfer = min(transfer, S.max_amount - S.amount)
|
||||
@@ -15,6 +19,6 @@
|
||||
S.add(transfer)
|
||||
|
||||
/obj/item/stack/Crossed(var/atom/movable/AM)
|
||||
if(AM != src && istype(AM, src.type) && !AM.throwing)
|
||||
if(isturf(AM.loc) && AM != src && istype(AM, src.type) && !AM.throwing)
|
||||
merge(AM)
|
||||
return ..()
|
||||
@@ -226,6 +226,13 @@
|
||||
|
||||
//Tries to unleash or recall your stored mob
|
||||
/obj/item/capture_crystal/attack_self(mob/living/user)
|
||||
if(bound_mob && !owner)
|
||||
if(bound_mob == user)
|
||||
to_chat(user, "<span class='notice'>\The [src] emits an unpleasant tone... It does not activate for you.</span>")
|
||||
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
|
||||
return
|
||||
if(tgui_alert(user, "\The [src] hasn't got an owner. It has \the [bound_mob] registered to it. Would you like to claim this as yours?", "Claim ownership", list("No","Yes")) == "Yes")
|
||||
owner = user
|
||||
if(!cooldown_check())
|
||||
to_chat(user, "<span class='notice'>\The [src] emits an unpleasant tone... It is not ready yet.</span>")
|
||||
if(bound_mob)
|
||||
|
||||
@@ -287,13 +287,12 @@
|
||||
desc = "A chocolate-coated biscuit stick."
|
||||
icon_state = "pockystick"
|
||||
item_state = "pocky"
|
||||
filling = list("sugar" = 2, "chocolate" = 5)
|
||||
type_butt = null
|
||||
|
||||
/obj/item/clothing/mask/chewable/candy/pocky/process()
|
||||
chew()
|
||||
if(chewtime < 1)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='notice'>There's no more of \the [name] left!</span>")
|
||||
spitout(0)
|
||||
|
||||
/obj/item/clothing/mask/chewable/candy/pocky/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("chocolate", 10)
|
||||
@@ -116,7 +116,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/C = loc
|
||||
if (src == C.wear_mask && C.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob
|
||||
reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.2) // Most of it is not inhaled... balance reasons.
|
||||
reagents.trans_to_mob(C, amount, CHEM_INGEST, 1.5) // I don't predict significant balance issues by letting blunts actually WORK.
|
||||
else // else just remove some of the reagents
|
||||
reagents.remove_any(REM)
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
name = "combat knife"
|
||||
desc = "If only you had a boot to put it in."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "tacknife"
|
||||
icon_state = "tacknife2"
|
||||
item_state = "knife"
|
||||
force_divisor = 0.34 // 20 with hardness 60 (steel)
|
||||
thrown_force_divisor = 1.75 // 20 with weight 20 (steel)
|
||||
@@ -101,7 +101,7 @@
|
||||
name = "boot knife"
|
||||
desc = "A small fixed-blade knife for putting inside a boot."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "tacknife"
|
||||
icon_state = "tacknife3"
|
||||
item_state = "knife"
|
||||
force_divisor = 0.15
|
||||
applies_material_colour = 0
|
||||
@@ -130,7 +130,7 @@
|
||||
|
||||
/obj/item/weapon/material/knife/butch
|
||||
name = "butcher's cleaver"
|
||||
icon_state = "butch"
|
||||
icon_state = "cleaver"
|
||||
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
|
||||
force_divisor = 0.25 // 15 when wielded with hardness 60 (steel)
|
||||
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
@@ -1,2 +1,15 @@
|
||||
/obj/item/weapon/storage/bag/chemistry
|
||||
slot_flags = null
|
||||
|
||||
/obj/item/weapon/storage/bag/xeno
|
||||
name = "xenobiology bag"
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "chembag"
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 12
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
w_class = ITEMSIZE_SMALL
|
||||
can_hold = list(
|
||||
/obj/item/slime_extract,
|
||||
/obj/item/slimepotion,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
|
||||
)
|
||||
@@ -32,7 +32,7 @@ much more likely to show up. This is done for several purposes;
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites/unidentified,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm/unidentified,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs/unidentified,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bliss/unidentified,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired/unidentified,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/serotrotium/unidentified,
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cryptobiolin/unidentified,
|
||||
@@ -108,7 +108,7 @@ much more likely to show up. This is done for several purposes;
|
||||
prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified,
|
||||
prob(40);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified,
|
||||
prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm/unidentified,
|
||||
prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs/unidentified,
|
||||
prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bliss/unidentified,
|
||||
prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/serotrotium/unidentified,
|
||||
prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cryptobiolin/unidentified,
|
||||
prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mindbreaker/unidentified,
|
||||
|
||||
@@ -49,7 +49,8 @@
|
||||
/obj/structure/closet/l3closet/scientist/double
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/bio_suit/scientist = 2,
|
||||
/obj/item/clothing/head/bio_hood/scientist = 2)
|
||||
/obj/item/clothing/head/bio_hood/scientist = 2,
|
||||
/obj/item/weapon/storage/bag/xeno = 2) // VOREEdit, adding the xenobag to xenobio.
|
||||
|
||||
|
||||
/obj/structure/closet/l3closet/medical
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/obj/structure/dispenser
|
||||
name = "tank storage unit"
|
||||
desc = "A simple yet bulky storage device for gas tanks. Has room for up to ten oxygen tanks, and ten phoron tanks."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon = 'icons/obj/objects_vr.dmi'
|
||||
icon_state = "dispenser"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
|
||||
@@ -90,4 +90,9 @@
|
||||
/datum/gear/textmug
|
||||
display_name = "mug with text"
|
||||
description = "A mug with something written on it."
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/textmug
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/textmug
|
||||
|
||||
/datum/gear/schnapsen
|
||||
display_name = "schnapsen playing cards"
|
||||
description = "French-suit playing cards! Pre-picked for 2-player mode."
|
||||
path = /obj/item/weapon/deck/schnapsen
|
||||
|
||||
@@ -198,13 +198,21 @@
|
||||
. += "<br>"
|
||||
|
||||
. += "<b>Custom Say: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_say=1'>Set Say Verb</a><br>"
|
||||
. += "<a href='?src=\ref[src];custom_say=1'>Set Say Verb</a>"
|
||||
. += "(<a href='?src=\ref[src];reset_say=1'>Reset</A>)"
|
||||
. += "<br>"
|
||||
. += "<b>Custom Whisper: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_whisper=1'>Set Whisper Verb</a><br>"
|
||||
. += "<a href='?src=\ref[src];custom_whisper=1'>Set Whisper Verb</a>"
|
||||
. += "(<a href='?src=\ref[src];reset_whisper=1'>Reset</A>)"
|
||||
. += "<br>"
|
||||
. += "<b>Custom Ask: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_ask=1'>Set Ask Verb</a><br>"
|
||||
. += "<a href='?src=\ref[src];custom_ask=1'>Set Ask Verb</a>"
|
||||
. += "(<a href='?src=\ref[src];reset_ask=1'>Reset</A>)"
|
||||
. += "<br>"
|
||||
. += "<b>Custom Exclaim: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_exclaim=1'>Set Exclaim Verb</a><br>"
|
||||
. += "<a href='?src=\ref[src];custom_exclaim=1'>Set Exclaim Verb</a>"
|
||||
. += "(<a href='?src=\ref[src];reset_exclaim=1'>Reset</A>)"
|
||||
. += "<br>"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/traits/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(!CanUseTopic(user))
|
||||
@@ -283,6 +291,30 @@
|
||||
pref.custom_exclaim = exclaim_choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["reset_say"])
|
||||
var/say_choice = tgui_alert(usr, "Reset your Custom Say Verb?","Reset Verb",list("Yes","No"))
|
||||
if(say_choice == "Yes")
|
||||
pref.custom_say = null
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["reset_whisper"])
|
||||
var/whisper_choice = tgui_alert(usr, "Reset your Custom Whisper Verb?","Reset Verb",list("Yes","No"))
|
||||
if(whisper_choice == "Yes")
|
||||
pref.custom_whisper = null
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["reset_ask"])
|
||||
var/ask_choice = tgui_alert(usr, "Reset your Custom Ask Verb?","Reset Verb",list("Yes","No"))
|
||||
if(ask_choice == "Yes")
|
||||
pref.custom_ask = null
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["reset_exclaim"])
|
||||
var/exclaim_choice = tgui_alert(usr, "Reset your Custom Exclaim Verb?","Reset Verb",list("Yes","No"))
|
||||
if(exclaim_choice == "Yes")
|
||||
pref.custom_exclaim = null
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["add_trait"])
|
||||
var/mode = text2num(href_list["add_trait"])
|
||||
var/list/picklist
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
name = "primitive clothes"
|
||||
desc = "Some patched together rags. Better than being naked."
|
||||
force = 0
|
||||
has_sensor = 0
|
||||
icon_state = "rag"
|
||||
worn_state = "rag"
|
||||
|
||||
@@ -41,26 +42,31 @@
|
||||
name = "tribalwear"
|
||||
desc = "A traditionally woven robe made with locally sourced material."
|
||||
icon_state = "tribal_common1"
|
||||
has_sensor = 0
|
||||
|
||||
/obj/item/clothing/under/tribalwear/common2
|
||||
name = "tribalwear"
|
||||
desc = "A traditionally woven outfit made with locally sourced material."
|
||||
icon_state = "tribal_common2"
|
||||
has_sensor = 0
|
||||
|
||||
/obj/item/clothing/under/tribalwear/hunter
|
||||
name = "hunting tribalwear"
|
||||
desc = "Dusty rags decorated with strips of leather and small pieces of cyan colored stones."
|
||||
icon_state = "tribal_hunter"
|
||||
has_sensor = 0
|
||||
|
||||
/obj/item/clothing/under/tribalwear/chief
|
||||
name = "chief's tribalwear"
|
||||
desc = "Well maintained robe adorned with fine leather and polished cyan stones."
|
||||
icon_state = "tribal_chief"
|
||||
has_sensor = 0
|
||||
|
||||
/obj/item/clothing/under/tribalwear/shaman
|
||||
name = "shaman robes"
|
||||
desc = "Carefully hand wozen cloth robes with heavy colored stones jewelry drapped over top."
|
||||
icon_state = "tribal_shaman"
|
||||
has_sensor = 0
|
||||
|
||||
/obj/item/clothing/shoes/tribalwear
|
||||
name = "tribal sandals"
|
||||
|
||||
@@ -530,6 +530,7 @@
|
||||
/obj/item/seeds/cocoapodseed = 3,
|
||||
/obj/item/seeds/plumpmycelium = 2,
|
||||
/obj/item/seeds/cabbageseed = 3,
|
||||
/obj/item/seeds/lettuce = 3,
|
||||
/obj/item/seeds/grapeseed = 3,
|
||||
/obj/item/seeds/pumpkinseed = 3,
|
||||
/obj/item/seeds/cherryseed = 3,
|
||||
@@ -1530,7 +1531,7 @@
|
||||
has_logs = 1
|
||||
|
||||
/obj/machinery/vending/wardrobe/lawdrobe
|
||||
name = "lawyer wardrobe vendor"
|
||||
name = "IAA wardrobe vendor"
|
||||
desc = "All the things you need to perform your job! Why didn't you already have them?"
|
||||
product_slogans = "Want to do your job? Sure you do!"
|
||||
icon_state = "lawdrobe"
|
||||
|
||||
@@ -1083,7 +1083,7 @@
|
||||
icon_state = "dankpocket"
|
||||
nutriment_amt = 2
|
||||
nutriment_desc = list("heartiness" = 1, "dough" = 2)
|
||||
heated_reagents = list("space_drugs" = 5)
|
||||
heated_reagents = list("bliss" = 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket
|
||||
name = "\improper Sin-pocket"
|
||||
@@ -3283,7 +3283,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/cosmicbrownies/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("protein", 2)
|
||||
reagents.add_reagent("space_drugs", 2)
|
||||
reagents.add_reagent("ambrosia_extract", 2)
|
||||
reagents.add_reagent("bicaridine", 1)
|
||||
reagents.add_reagent("kelotane", 1)
|
||||
reagents.add_reagent("toxin", 1)
|
||||
@@ -4086,7 +4086,7 @@
|
||||
|
||||
reagents.add_reagent("oxycodone", 1)
|
||||
reagents.add_reagent("sifsap", 5)
|
||||
reagents.add_reagent("space_drugs", 5)
|
||||
reagents.add_reagent("bliss", 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bellefritter
|
||||
name = "frostbelle fritters"
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
desc = "A mysterious slice, coated in purple frosting that smells like grapes."
|
||||
nutriment_desc = list("The desire to show off an party" = 10)
|
||||
reagents.add_reagent("stoxin", 2)
|
||||
reagents.add_reagent("space_drugs", 10)
|
||||
reagents.add_reagent("bliss", 10)
|
||||
reagents.add_reagent("serotrotium", 4)
|
||||
reagents.add_reagent("cryptobiolin", 8)
|
||||
reagents.add_reagent("mindbreaker", 10)
|
||||
|
||||
@@ -281,7 +281,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/carpmeat
|
||||
)
|
||||
reagents = list("spacespice" = 1)
|
||||
fruit = list("cabbage" = 1, "lime" = 1)
|
||||
fruit = list("lettuce" = 1, "lime" = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/grilled_carp
|
||||
|
||||
/datum/recipe/grilledcheese
|
||||
|
||||
@@ -433,7 +433,7 @@ I said no!
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/beetsoup
|
||||
|
||||
/datum/recipe/tossedsalad
|
||||
fruit = list("cabbage" = 2, "tomato" = 1, "carrot" = 1, "apple" = 1)
|
||||
fruit = list("lettuce" = 2, "tomato" = 1, "carrot" = 1, "apple" = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/tossedsalad
|
||||
|
||||
/datum/recipe/flowersalad
|
||||
@@ -1083,7 +1083,7 @@ I said no!
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/fish_taco
|
||||
|
||||
/datum/recipe/blt
|
||||
fruit = list("tomato" = 1, "cabbage" = 1)
|
||||
fruit = list("tomato" = 1, "lettuce" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/slice/bread,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/slice/bread,
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi
|
||||
|
||||
/datum/recipe/lobster
|
||||
fruit = list("lemon" = 1, "cabbage" = 1)
|
||||
fruit = list("lemon" = 1, "lettuce" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/lobster
|
||||
)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
// this is a playing card deck based off of the Austrian/Hungarian national card game, Schnapsen
|
||||
//TODO: Sprite up Double German/William Tell card icons. Sending this in as is as I suck at spriting and want to play schnapsen
|
||||
//TODO: Implement functionality for "sub-decks": Create a over-schnapsen deck with nines, eights and sevens.
|
||||
//TODO:Let players choose 2,3,4 player mode to get decks of ace/ten/jack/queen/king + seven for 3 player, nine+eight for 4 player modes.
|
||||
|
||||
/obj/item/weapon/deck/schnapsen
|
||||
name = "deck of schnapsen cards"
|
||||
desc = "An ancient trick-taking card game from a bygone-Earth country. For 2 players!"
|
||||
icon_state = "deck"
|
||||
|
||||
/obj/item/weapon/deck/schnapsen/New()
|
||||
..()
|
||||
//Stealing french card icons.
|
||||
var/datum/playingcard/P
|
||||
var/colour
|
||||
for(var/suit in list("spades","clubs","diamonds","hearts"))
|
||||
if(suit == "spades" || suit == "clubs")
|
||||
colour = "black_"
|
||||
else
|
||||
colour = "red_"
|
||||
for(var/number in list("ace","ten","jack","queen","king")) //Schnapsen has knight worth 2 pts, queen 3 pts, king 4. Ace 11, ten 10
|
||||
P = new()
|
||||
P.name = "[number] of [suit]"
|
||||
if(number == "ten")
|
||||
P.card_icon = "[colour]num"
|
||||
else
|
||||
P.card_icon = "[colour]col"
|
||||
P.back_icon = "card_back"
|
||||
cards += P
|
||||
@@ -88,7 +88,7 @@
|
||||
descriptors |= "radioactive"
|
||||
if(reagents.has_reagent("amatoxin") || reagents.has_reagent("toxin"))
|
||||
descriptors |= "poisonous"
|
||||
if(reagents.has_reagent("psilocybin") || reagents.has_reagent("space_drugs") || reagents.has_reagent("earthsblood"))
|
||||
if(reagents.has_reagent("psilocybin") || reagents.has_reagent("bliss") || reagents.has_reagent("earthsblood"))
|
||||
descriptors |= "hallucinogenic"
|
||||
if(reagents.has_reagent("bicaridine") || reagents.has_reagent("earthsblood"))
|
||||
descriptors |= "medicinal"
|
||||
@@ -185,7 +185,7 @@
|
||||
pocell.charge = pocell.maxcharge
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
if(W.sharp)
|
||||
|
||||
if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful.
|
||||
@@ -213,7 +213,7 @@
|
||||
to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.get_amount()] planks.")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
if(seed.kitchen_tag == "sunflower")
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/rawsunflower(get_turf(src))
|
||||
to_chat(user, SPAN_NOTICE("You remove the seeds from the flower, slightly damaging them."))
|
||||
@@ -225,25 +225,25 @@
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
if(!isnull(seed.chems["carrotjuice"]))
|
||||
to_chat(user, "You slice \the [src] into sticks.")
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
if(!isnull(seed.chems["pineapplejuice"]))
|
||||
to_chat(user, "You slice \the [src] into rings.")
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/pineapple_ring(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
if(!isnull(seed.chems["soymilk"]))
|
||||
to_chat(user, "You roughly chop up \the [src].")
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
if(seed.get_trait(TRAIT_FLESH_COLOUR))
|
||||
to_chat(user, "You slice up \the [src].")
|
||||
var/slices = rand(3,5)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
display_name = "ambrosia vulgaris"
|
||||
kitchen_tag = "ambrosia"
|
||||
mutants = list("ambrosiadeus")
|
||||
chems = list("nutriment" = list(1), "space_drugs" = list(1,8), "kelotane" = list(1,8,1), "bicaridine" = list(1,10,1), "toxin" = list(1,10))
|
||||
chems = list("nutriment" = list(1), "ambrosia_extract" = list(1,8), "kelotane" = list(1,8,1), "bicaridine" = list(1,10,1))
|
||||
|
||||
/datum/seed/ambrosia/New()
|
||||
..()
|
||||
@@ -25,7 +25,7 @@
|
||||
display_name = "ambrosia deus"
|
||||
kitchen_tag = "ambrosiadeus"
|
||||
mutants = list("ambrosiainfernus", "ambrosiagaia")
|
||||
chems = list("nutriment" = list(1), "bicaridine" = list(1,8), "synaptizine" = list(1,8,1), "hyperzine" = list(1,10,1), "space_drugs" = list(1,10))
|
||||
chems = list("nutriment" = list(1), "bicaridine" = list(1,8), "synaptizine" = list(1,8,1), "hyperzine" = list(1,10,1), "ambrosia_extract" = list(1,10))
|
||||
|
||||
/datum/seed/ambrosia/deus/New()
|
||||
..()
|
||||
@@ -38,7 +38,7 @@
|
||||
display_name = "ambrosia infernus"
|
||||
kitchen_tag = "ambrosiainfernus"
|
||||
mutants = null
|
||||
chems = list("nutriment" = list(1,3), "oxycodone" = list(1,8), "impedrezene" = list(1,10), "mindbreaker" = list(1,10))
|
||||
chems = list("nutriment" = list(1,3), "oxycodone" = list(1,8), "impedrezene" = list(1,10), "mindbreaker" = list(1,10), "ambrosia_extract" = list(1,10))
|
||||
|
||||
/datum/seed/ambrosia/infernus/New()
|
||||
..()
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "lettuce"
|
||||
seed_name = "lettuce"
|
||||
display_name = "lettuce"
|
||||
kitchen_tag = "cabbage"
|
||||
kitchen_tag = "lettuce"
|
||||
chems = list("nutriment" = list(1,15))
|
||||
|
||||
/datum/seed/lettuce/New()
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
seed_name = "liberty cap"
|
||||
display_name = "liberty cap mushrooms"
|
||||
mutants = null
|
||||
chems = list("nutriment" = list(1), "stoxin" = list(3,3), "space_drugs" = list(1,25))
|
||||
chems = list("nutriment" = list(1), "stoxin" = list(3,3), "bliss" = list(1,25))
|
||||
|
||||
/datum/seed/mushroom/hallucinogenic/strong/New()
|
||||
..()
|
||||
|
||||
@@ -6,7 +6,7 @@ var/list/mining_overlay_cache = list()
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "rock-dark"
|
||||
density = TRUE
|
||||
|
||||
|
||||
/turf/simulated/mineral //wall piece
|
||||
name = "rock"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
@@ -23,6 +23,8 @@ var/list/mining_overlay_cache = list()
|
||||
var/rock_side_icon_state = "rock_side"
|
||||
var/sand_icon_state = "asteroid"
|
||||
var/rock_icon_state = "rock"
|
||||
var/sand_icon_path = 'icons/turf/flooring/asteroid.dmi' // Override this on a subtype turf if you want a custom icon
|
||||
var/rock_icon_path = 'icons/turf/walls.dmi' // Override this on a subtype turf if you want a custom icon
|
||||
var/random_icon = 0
|
||||
|
||||
var/ore/mineral
|
||||
@@ -30,6 +32,7 @@ var/list/mining_overlay_cache = list()
|
||||
var/mined_ore = 0
|
||||
var/last_act = 0
|
||||
var/overlay_detail
|
||||
var/overlay_detail_icon_path = 'icons/turf/flooring/decals.dmi' // Override this on a subtype turf if you want a custom icon
|
||||
|
||||
var/datum/geosample/geologic_data
|
||||
var/excavation_level = 0
|
||||
@@ -220,7 +223,7 @@ var/list/mining_overlay_cache = list()
|
||||
else
|
||||
name = "rock"
|
||||
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon = rock_icon_path
|
||||
icon_state = rock_icon_state
|
||||
|
||||
//Apply overlays if we should have borders
|
||||
@@ -238,7 +241,7 @@ var/list/mining_overlay_cache = list()
|
||||
//We are a sand floor
|
||||
else
|
||||
name = floor_name
|
||||
icon = 'icons/turf/flooring/asteroid.dmi'
|
||||
icon = sand_icon_path
|
||||
icon_state = sand_icon_state
|
||||
|
||||
if(sand_dug)
|
||||
@@ -253,10 +256,10 @@ var/list/mining_overlay_cache = list()
|
||||
else
|
||||
var/turf/T = get_step(src, direction)
|
||||
if(istype(T) && T.density)
|
||||
add_overlay(get_cached_border(rock_side_icon_state,direction,'icons/turf/walls.dmi',rock_side_icon_state))
|
||||
add_overlay(get_cached_border(rock_side_icon_state,direction,rock_icon_path,rock_side_icon_state))
|
||||
|
||||
if(overlay_detail)
|
||||
add_overlay('icons/turf/flooring/decals.dmi',overlay_detail)
|
||||
add_overlay(overlay_detail_icon_path,overlay_detail)
|
||||
|
||||
if(update_neighbors)
|
||||
for(var/direction in alldirs)
|
||||
|
||||
@@ -330,7 +330,7 @@
|
||||
/obj/item/weapon/farmbot_arm_assembly
|
||||
name = "water tank/robot arm assembly"
|
||||
desc = "A water tank with a robot arm permanently grafted to it."
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon = 'icons/obj/chemical_tanks.dmi'
|
||||
icon_state = "water_arm"
|
||||
var/build_step = 0
|
||||
var/created_name = "Farmbot"
|
||||
|
||||
@@ -70,3 +70,31 @@
|
||||
typing = FALSE
|
||||
|
||||
return state
|
||||
|
||||
// Vorestation edit start
|
||||
|
||||
/mob/living/carbon/brain/verb/backup_ping()
|
||||
set category = "IC"
|
||||
set name = "Notify Transcore"
|
||||
set desc = "Your body is gone. Notify robotics to be resleeved!"
|
||||
var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name)
|
||||
if(db)
|
||||
var/datum/transhuman/mind_record/record = db.backed_up[src.mind.name]
|
||||
if(!(record.dead_state == MR_DEAD))
|
||||
if((world.time - timeofhostdeath ) > 5 MINUTES) //Allows notify transcore to be used if you have an entry but for some reason weren't marked as dead
|
||||
record.dead_state = MR_DEAD //Such as if you got scanned but didn't take an implant. It's a little funky, but I mean, you got scanned
|
||||
db.notify(record) //So you probably will want to let someone know if you die.
|
||||
record.last_notification = world.time
|
||||
to_chat(src, "<span class='notice'>New notification has been sent.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Your backup is not past-due yet.</span>")
|
||||
else if((world.time - record.last_notification) < 5 MINUTES)
|
||||
to_chat(src, "<span class='warning'>Too little time has passed since your last notification.</span>")
|
||||
else
|
||||
db.notify(record)
|
||||
record.last_notification = world.time
|
||||
to_chat(src, "<span class='notice'>New notification has been sent.</span>")
|
||||
else
|
||||
to_chat(src,"<span class='warning'>No backup record could be found, sorry.</span>")
|
||||
|
||||
// VS edit ends
|
||||
|
||||
@@ -430,6 +430,10 @@
|
||||
else
|
||||
chem_effects[effect] = magnitude
|
||||
|
||||
/mob/living/carbon/proc/remove_chemical_effect(var/effect, var/magnitude)
|
||||
if(effect in chem_effects)
|
||||
chem_effects[effect] = magnitude ? max(0,chem_effects[effect]-magnitude) : 0
|
||||
|
||||
/mob/living/carbon/get_default_language()
|
||||
if(default_language)
|
||||
if(can_speak(default_language))
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
// ====
|
||||
/datum/medical_effect/itch
|
||||
name = "Itch"
|
||||
triggers = list("space_drugs" = 10)
|
||||
triggers = list("bliss" = 10)
|
||||
cures = list("inaprovaline")
|
||||
cure_message = "The itching stops..."
|
||||
|
||||
|
||||
@@ -84,6 +84,8 @@
|
||||
handle_shock()
|
||||
|
||||
handle_pain()
|
||||
|
||||
handle_allergens()
|
||||
|
||||
handle_medical_side_effects()
|
||||
|
||||
@@ -638,6 +640,35 @@
|
||||
breath.update_values()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/handle_allergens()
|
||||
if(chem_effects[CE_ALLERGEN])
|
||||
//first, multiply the basic species-level value by our allergen effect rating, so consuming multiple seperate allergen typess simultaneously hurts more
|
||||
var/damage_severity = species.allergen_damage_severity * chem_effects[CE_ALLERGEN]
|
||||
var/disable_severity = species.allergen_disable_severity * chem_effects[CE_ALLERGEN]
|
||||
if(species.allergen_reaction & AG_PHYS_DMG)
|
||||
adjustBruteLoss(damage_severity)
|
||||
if(species.allergen_reaction & AG_BURN_DMG)
|
||||
adjustFireLoss(damage_severity)
|
||||
if(species.allergen_reaction & AG_TOX_DMG)
|
||||
adjustToxLoss(damage_severity)
|
||||
if(species.allergen_reaction & AG_OXY_DMG)
|
||||
adjustOxyLoss(damage_severity)
|
||||
if(prob(disable_severity/2))
|
||||
emote(pick("cough","gasp","choke"))
|
||||
if(species.allergen_reaction & AG_EMOTE)
|
||||
if(prob(disable_severity/2))
|
||||
emote(pick("pale","shiver","twitch"))
|
||||
if(species.allergen_reaction & AG_PAIN)
|
||||
adjustHalLoss(disable_severity)
|
||||
if(species.allergen_reaction & AG_WEAKEN)
|
||||
Weaken(disable_severity)
|
||||
if(species.allergen_reaction & AG_BLURRY)
|
||||
eye_blurry = max(eye_blurry, disable_severity)
|
||||
if(species.allergen_reaction & AG_SLEEPY)
|
||||
drowsyness = max(drowsyness, disable_severity)
|
||||
if(species.allergen_reaction & AG_CONFUSE)
|
||||
Confuse(disable_severity/4)
|
||||
|
||||
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
|
||||
@@ -53,9 +53,9 @@
|
||||
|
||||
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
|
||||
var/allergens = null // Things that will make this species very sick
|
||||
var/allergen_reaction = AG_TOX_DMG|AG_OXY_DMG|AG_EMOTE|AG_PAIN|AG_BLURRY|AG_CONFUSE // What type of reactions will you have? These the 'main' options and are intended to approximate anaphylactic shock at high doses. VOREStation Edit'd.
|
||||
var/allergen_damage_severity = 4 // How bad are reactions to the allergen? Touch with extreme caution. VOREStation Edit'd.
|
||||
var/allergen_disable_severity = 4 // Whilst this determines how long nonlethal effects last and how common emotes are. VOREStation Edit'd.
|
||||
var/allergen_reaction = AG_TOX_DMG|AG_OXY_DMG|AG_EMOTE|AG_PAIN|AG_BLURRY|AG_CONFUSE // What type of reactions will you have? These the 'main' options and are intended to approximate anaphylactic shock at high doses.
|
||||
var/allergen_damage_severity = 2.5 // How bad are reactions to the allergen? Touch with extreme caution.
|
||||
var/allergen_disable_severity = 10 // Whilst this determines how long nonlethal effects last and how common emotes are.
|
||||
|
||||
var/min_age = 17
|
||||
var/max_age = 70
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
var/blood_color = species.blood_color
|
||||
var/flesh_color = species.flesh_color
|
||||
new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color)
|
||||
|
||||
|
||||
playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50)
|
||||
|
||||
revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often.
|
||||
@@ -813,7 +813,7 @@
|
||||
|
||||
/mob/living/proc/flying_toggle()
|
||||
set name = "Toggle Flight"
|
||||
set desc = "While flying over open spaces, you will use up some nutrition. If you run out nutrition, you will fall. Additionally, you can't fly if you are too heavy."
|
||||
set desc = "While flying over open spaces, you will use up some nutrition. If you run out nutrition, you will fall."
|
||||
set category = "Abilities"
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
@@ -826,14 +826,25 @@
|
||||
if(C.nutrition < 25 && !C.flying) //Don't have any food in you?" You can't fly.
|
||||
to_chat(C, "<span class='notice'>You lack the nutrition to fly.</span>")
|
||||
return
|
||||
if(C.nutrition > 1000 && !C.flying)
|
||||
to_chat(C, "<span class='notice'>You have eaten too much to fly! You need to lose some nutrition.</span>")
|
||||
return
|
||||
|
||||
C.flying = !C.flying
|
||||
update_floating()
|
||||
to_chat(C, "<span class='notice'>You have [C.flying?"started":"stopped"] flying.</span>")
|
||||
|
||||
/mob/living/
|
||||
var/flight_vore = FALSE
|
||||
|
||||
/mob/living/proc/flying_vore_toggle()
|
||||
set name = "Toggle Flight Vore"
|
||||
set desc = "Allows you to engage in voracious misadventures while flying."
|
||||
set category = "Abilities"
|
||||
|
||||
flight_vore = !flight_vore
|
||||
if(flight_vore)
|
||||
to_chat(src, "You have allowed for flight vore! Bumping into characters while flying will now trigger dropnoms! Unless prefs don't match.. then you will take a tumble!")
|
||||
else
|
||||
to_chat(src, "Flight vore disabled! You will no longer engage dropnoms while in flight.")
|
||||
|
||||
//Proc to stop inertial_drift. Exchange nutrition in order to stop gliding around.
|
||||
/mob/living/proc/start_wings_hovering()
|
||||
set name = "Hover"
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
/mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/carbon/human/proc/tie_hair,
|
||||
/mob/living/proc/flying_toggle,
|
||||
/mob/living/proc/flying_vore_toggle,
|
||||
/mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits.
|
||||
|
||||
virus_immune = 1 // They practically ARE one.
|
||||
@@ -205,7 +206,7 @@
|
||||
feral++
|
||||
else
|
||||
feral = max(0,--feral)
|
||||
|
||||
|
||||
// Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
|
||||
var/turf/T = get_turf(H)
|
||||
if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
|
||||
|
||||
@@ -129,6 +129,7 @@
|
||||
name_language = LANGUAGE_BIRDSONG
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/proc/flying_toggle,
|
||||
/mob/living/proc/flying_vore_toggle,
|
||||
/mob/living/proc/start_wings_hovering,
|
||||
/mob/living/carbon/human/proc/tie_hair)
|
||||
min_age = 18
|
||||
@@ -356,7 +357,7 @@
|
||||
name_language = null
|
||||
color_mult = 1
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering,/mob/living/carbon/human/proc/tie_hair)
|
||||
inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/flying_vore_toggle,/mob/living/proc/start_wings_hovering,/mob/living/carbon/human/proc/tie_hair)
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
desc = "This trait drastically reduces the effects of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to special reactions (such as unathi drowsiness from sugars)."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("allergen_damage_severity" = 2, "allergen_disable_severity" = 3)
|
||||
var_changes = list("allergen_damage_severity" = 1.25, "allergen_disable_severity" = 5)
|
||||
excludes = list(/datum/trait/neutral/allergen_increased_effect)
|
||||
|
||||
/datum/trait/neutral/allergen_increased_effect
|
||||
@@ -259,7 +259,7 @@
|
||||
desc = "This trait drastically increases the effects of allergen reactions, enough that even a small dose can be lethal. If you don't have any allergens set, it does nothing. It does not apply to special reactions (such as unathi drowsiness from sugars)."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("allergen_damage_severity" = 8, "allergen_disable_severity" = 6)
|
||||
var_changes = list("allergen_damage_severity" = 5, "allergen_disable_severity" = 20)
|
||||
excludes = list(/datum/trait/neutral/allergen_reduced_effect)
|
||||
|
||||
// Spicy Food Traits, from negative to positive.
|
||||
|
||||
@@ -111,6 +111,7 @@
|
||||
/datum/trait/positive/winged_flight/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/proc/flying_toggle
|
||||
H.verbs |= /mob/living/proc/flying_vore_toggle
|
||||
H.verbs |= /mob/living/proc/start_wings_hovering
|
||||
|
||||
/datum/trait/positive/soft_landing
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
/obj/item/weapon/camera_assembly,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/weapon/circuitboard,
|
||||
/obj/item/weapon/smes_coil
|
||||
/obj/item/weapon/smes_coil,
|
||||
/obj/item/weapon/fuel_assembly
|
||||
)
|
||||
|
||||
var/obj/item/wrapped = null // Item currently being held.
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/vore_stomach_flavor // The flavortext for the first belly if not the default
|
||||
|
||||
var/vore_default_item_mode = IM_DIGEST_FOOD //How belly will interact with items
|
||||
var/vore_default_contaminates = TRUE //Will it contaminate?
|
||||
var/vore_default_contaminates = FALSE //Will it contaminate?
|
||||
var/vore_default_contamination_flavor = "Generic" //Contamination descriptors
|
||||
var/vore_default_contamination_color = "green" //Contamination color
|
||||
|
||||
|
||||
@@ -333,3 +333,11 @@
|
||||
icon_state = "mermaid_s"
|
||||
can_ride = 0
|
||||
icon_sprite_tag = "mermaid"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/noodle
|
||||
name = "Eastern Dragon (Taur)"
|
||||
icon_state = "noodle_s"
|
||||
extra_overlay = "noodle_markings"
|
||||
suit_sprites = 'icons/mob/taursuits_noodle.dmi'
|
||||
clip_mask_state = "taur_clip_mask_noodle"
|
||||
icon_sprite_tag = "noodle"
|
||||
|
||||
@@ -583,4 +583,13 @@
|
||||
icon_state = "rat_s"
|
||||
extra_overlay = "rat_markings"
|
||||
clip_mask_state = "taur_clip_mask_rat"
|
||||
icon_sprite_tag = "rat"
|
||||
icon_sprite_tag = "rat"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/noodle
|
||||
name = "Eastern Dragon (Taur)"
|
||||
icon_state = "noodle_s"
|
||||
extra_overlay = "noodle_markings"
|
||||
extra_overlay2 = "noodle_markings_2"
|
||||
suit_sprites = 'icons/mob/taursuits_noodle_vr.dmi'
|
||||
clip_mask_state = "taur_clip_mask_noodle"
|
||||
icon_sprite_tag = "noodle"
|
||||
@@ -243,9 +243,6 @@
|
||||
if(L.incapacitated(INCAPACITATION_ALL))
|
||||
L.stop_flying()
|
||||
//Just here to see if the person is KO'd, stunned, etc. If so, it'll move onto can_fall.
|
||||
else if (L.nutrition > 1000) //Eat too much while flying? Get fat and fall.
|
||||
to_chat(L, "<span class='danger'>You're too heavy! Your wings give out and you plummit to the ground!</span>")
|
||||
L.stop_flying() //womp womp.
|
||||
else if(L.nutrition < 300 && L.nutrition > 299.4) //290 would be risky, as metabolism could mess it up. Let's do 289.
|
||||
to_chat(L, "<span class='danger'>You are starting to get fatigued... You probably have a good minute left in the air, if that. Even less if you continue to fly around! You should get to the ground soon!</span>") //Ticks are, on average, 3 seconds. So this would most likely be 90 seconds, but lets just say 60.
|
||||
L.adjust_nutrition(-0.5)
|
||||
|
||||
@@ -43,13 +43,13 @@
|
||||
|
||||
var/mob/living/prey = src
|
||||
var/fallloc = prey.loc
|
||||
if(pred.can_be_drop_pred && prey.can_be_drop_prey)
|
||||
if(pred.can_be_drop_pred && prey.can_be_drop_prey && pred.drop_vore && prey.drop_vore)
|
||||
pred.feed_grabbed_to_self_falling_nom(pred,prey)
|
||||
pred.loc = fallloc
|
||||
if(!safe_fall)
|
||||
pred.Weaken(8)
|
||||
pred.visible_message("<span class='danger'>\The [pred] falls right onto \the [prey]!</span>")
|
||||
else if(prey.can_be_drop_pred && pred.can_be_drop_prey)
|
||||
else if(prey.can_be_drop_pred && pred.can_be_drop_prey && pred.drop_vore && prey.drop_vore)
|
||||
prey.feed_grabbed_to_self_falling_nom(prey,pred)
|
||||
pred.Weaken(4)
|
||||
pred.visible_message("<span class='danger'>\The [pred] falls right into \the [prey]!</span>")
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
name = "power cell"
|
||||
desc = "A rechargable electrochemical power cell."
|
||||
icon = 'icons/obj/power_cells.dmi'
|
||||
icon_state = "b_st"
|
||||
icon_state = "standard"
|
||||
item_state = "cell"
|
||||
origin_tech = list(TECH_POWER = 1)
|
||||
force = 5.0
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/obj/item/weapon/cell/device
|
||||
name = "device power cell"
|
||||
desc = "A small power cell designed to power handheld devices."
|
||||
icon_state = "m_st"
|
||||
icon_state = "device_cell"
|
||||
item_state = "egg6"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
force = 0
|
||||
@@ -16,7 +16,7 @@
|
||||
/obj/item/weapon/cell/device/weapon
|
||||
name = "weapon power cell"
|
||||
desc = "A small power cell designed to power handheld weaponry."
|
||||
icon_state = "m_sup"
|
||||
icon_state = "weapon_cell"
|
||||
maxcharge = 2400
|
||||
charge_amount = 20
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/weapon/cell/device/weapon/recharge
|
||||
name = "self-charging weapon power cell"
|
||||
desc = "A small power cell designed to power handheld weaponry. This one recharges itself."
|
||||
icon_state = "meb_m_nu"
|
||||
icon_state = "sc_weapon_cell"
|
||||
self_recharge = TRUE
|
||||
charge_amount = 120
|
||||
charge_delay = 75
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "modified power cell"
|
||||
desc = "A modified power cell sitting in a highly conductive chassis."
|
||||
origin_tech = list(TECH_POWER = 2)
|
||||
icon_state = "exs_m"
|
||||
icon_state = "modded"
|
||||
maxcharge = 10000
|
||||
matter = list(MAT_STEEL = 1000, MAT_GLASS = 80, MAT_SILVER = 100)
|
||||
self_recharge = TRUE
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "\improper rechargable AA battery"
|
||||
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
|
||||
origin_tech = list(TECH_POWER = 0)
|
||||
icon_state = "s_st"
|
||||
icon_state = "crap"
|
||||
maxcharge = 500
|
||||
matter = list(MAT_STEEL = 700, MAT_GLASS = 40)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
/obj/item/weapon/cell/secborg
|
||||
name = "security borg rechargable D battery"
|
||||
origin_tech = list(TECH_POWER = 0)
|
||||
icon_state = "meb_s_st"
|
||||
icon_state = "secborg"
|
||||
maxcharge = 600 //600 max charge / 100 charge per shot = six shots
|
||||
matter = list(MAT_STEEL = 700, MAT_GLASS = 40)
|
||||
|
||||
@@ -25,14 +25,14 @@
|
||||
/obj/item/weapon/cell/apc
|
||||
name = "heavy-duty power cell"
|
||||
origin_tech = list(TECH_POWER = 1)
|
||||
icon_state = "meb_b_st"
|
||||
icon_state = "apc"
|
||||
maxcharge = 5000
|
||||
matter = list(MAT_STEEL = 700, MAT_GLASS = 50)
|
||||
|
||||
/obj/item/weapon/cell/high
|
||||
name = "high-capacity power cell"
|
||||
origin_tech = list(TECH_POWER = 2)
|
||||
icon_state = "b_hi"
|
||||
icon_state = "high"
|
||||
maxcharge = 10000
|
||||
matter = list(MAT_STEEL = 700, MAT_GLASS = 60)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/obj/item/weapon/cell/super
|
||||
name = "super-capacity power cell"
|
||||
origin_tech = list(TECH_POWER = 5)
|
||||
icon_state = "b_sup"
|
||||
icon_state = "super"
|
||||
maxcharge = 20000
|
||||
matter = list(MAT_STEEL = 700, MAT_GLASS = 70)
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
/obj/item/weapon/cell/hyper
|
||||
name = "hyper-capacity power cell"
|
||||
origin_tech = list(TECH_POWER = 6)
|
||||
icon_state = "b_hy"
|
||||
icon_state = "hyper"
|
||||
maxcharge = 30000
|
||||
matter = list(MAT_STEEL = 700, MAT_GLASS = 80)
|
||||
|
||||
@@ -67,13 +67,13 @@
|
||||
|
||||
/obj/item/weapon/cell/mech
|
||||
name = "mecha power cell"
|
||||
icon_state = "exs_l"
|
||||
icon_state = "mech"
|
||||
charge = 15000
|
||||
maxcharge = 15000
|
||||
|
||||
/obj/item/weapon/cell/infinite
|
||||
name = "infinite-capacity power cell!"
|
||||
icon_state = "infinite_b"
|
||||
icon_state = "infinite"
|
||||
origin_tech = null
|
||||
maxcharge = 30000 //determines how badly mobs get shocked
|
||||
matter = list(MAT_STEEL = 700, MAT_GLASS = 80)
|
||||
@@ -88,8 +88,7 @@
|
||||
name = "potato battery"
|
||||
desc = "A rechargable starch based power cell."
|
||||
origin_tech = list(TECH_POWER = 1)
|
||||
icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi'
|
||||
icon_state = "potato_cell" //"potato_battery"
|
||||
icon_state = "potato"
|
||||
charge = 100
|
||||
maxcharge = 300
|
||||
minor_fault = 1
|
||||
@@ -112,7 +111,7 @@
|
||||
name = "backup battery"
|
||||
desc = "A small one-time-use chemical battery for synthetic crew when they are low on power in emergency situations."
|
||||
icon = 'icons/obj/power_cells.dmi'
|
||||
icon_state = "exs_s"
|
||||
icon_state = "backup"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/amount = 100
|
||||
var/used = FALSE
|
||||
@@ -150,7 +149,7 @@
|
||||
desc = "A tiny power cell with a very low power capacity. Used in light fixtures to power them in the event of an outage."
|
||||
maxcharge = 120 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell
|
||||
matter = list(MAT_GLASS = 20)
|
||||
icon_state = "meb_s_sup"
|
||||
icon_state = "em_light"
|
||||
w_class = ITEMSIZE_TINY
|
||||
|
||||
/obj/item/weapon/cell/emergency_light/Initialize()
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/*
|
||||
* Laser Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/laser
|
||||
name = "laser rifle"
|
||||
desc = "A Hephaestus Industries G40E rifle, designed to kill with concentrated energy blasts. This variant has the ability to \
|
||||
@@ -53,39 +56,23 @@
|
||||
list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 12),
|
||||
)
|
||||
|
||||
//Functionally identical, but slightly higher tech due to rarer.
|
||||
/*
|
||||
* Sleek Laser Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/laser/sleek
|
||||
name = "\improper LR1 Shishi"
|
||||
desc = "A Bishamonten Company LR1 Shishi rifle, a rare early 23rd century futurist design with a nonetheless timeless ability to kill."
|
||||
description_fluff = "Bisamonten was arms company that operated from roughly 2150-2280 - the height of the first extrasolar colonisation boom - before filing for bankruptcy and selling off its assets to various companies that would go on to become today’s TSCs. \
|
||||
Focused on sleek ‘futurist’ designs which have largely fallen out of fashion but remain popular with collectors and people hoping to make some quick thalers from replica weapons. \
|
||||
Their weapons tended to be form over function - despite their flashy looks, most were completely unremarkable one way or another as weapons and used very standard firing mechanisms."
|
||||
name = "\improper LR1 \"Shishi\""
|
||||
desc = "A Bishamonten Company LR1 \"Shishi\" rifle, a rare early 23rd century futurist design with a nonetheless timeless ability to kill."
|
||||
description_fluff = "Bisamonten was arms company that operated from roughly 2150-2280 - the height of the first extrasolar colonisation boom - before filing for \
|
||||
bankruptcy and selling off its assets to various companies that would go on to become today’s TSCs. Focused on sleek ‘futurist’ designs which have largely \
|
||||
fallen out of fashion but remain popular with collectors and people hoping to make some quick thalers from replica weapons. Their weapons tended to be form \
|
||||
over function - despite their flashy looks, most were completely unremarkable one way or another as weapons and used very standard firing mechanisms."
|
||||
icon_state = "lrifle"
|
||||
item_state = "lrifle"
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 3)
|
||||
|
||||
/obj/item/weapon/gun/energy/mininglaser
|
||||
name = "mining-laser rifle"
|
||||
desc = "A Hephaestus Industries G22T rifle, now only produced for its impeccable ability to break stone with its pulsating blasts."
|
||||
description_fluff = "The leading arms producer in the SCG, Hephaestus typically only uses its 'top level' branding for its military-grade equipment used by armed forces across human space."
|
||||
icon = 'icons/obj/gun2.dmi'
|
||||
icon_state = "mininglaser"
|
||||
item_state = "laser"
|
||||
wielded_item_state = "laser-wielded"
|
||||
fire_delay = 8
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 15
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
||||
matter = list(MAT_STEEL = 2000)
|
||||
projectile_type = /obj/item/projectile/beam/mininglaser
|
||||
one_handed_penalty = 30
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="mining", fire_delay=8, projectile_type=/obj/item/projectile/beam/mininglaser, charge_cost = 200),
|
||||
list(mode_name="deter", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 80),
|
||||
)
|
||||
|
||||
/*
|
||||
* Retro Laser Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/retro
|
||||
name = "retro laser"
|
||||
icon_state = "retro"
|
||||
@@ -104,6 +91,22 @@
|
||||
icon_state = "retro"
|
||||
cell_type = null
|
||||
|
||||
/*
|
||||
* Alien Pistol
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/alien
|
||||
name = "alien pistol"
|
||||
desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages."
|
||||
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol)
|
||||
icon_state = "alienpistol"
|
||||
item_state = "alienpistol"
|
||||
fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose.
|
||||
charge_cost = 480 // Five shots.
|
||||
|
||||
projectile_type = /obj/item/projectile/beam/cyan
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien // Self charges.
|
||||
origin_tech = list(TECH_COMBAT = 8, TECH_MAGNET = 7)
|
||||
modifystate = "alienpistol"
|
||||
|
||||
/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol
|
||||
name = "Precursor Alpha Weapon - Appendageheld Laser"
|
||||
@@ -133,21 +136,9 @@
|
||||
may have caused it to degrade, yet still remain functional at a reduced capability."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/obj/item/weapon/gun/energy/alien
|
||||
name = "alien pistol"
|
||||
desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages."
|
||||
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol)
|
||||
icon_state = "alienpistol"
|
||||
item_state = "alienpistol"
|
||||
fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose.
|
||||
charge_cost = 480 // Five shots.
|
||||
|
||||
projectile_type = /obj/item/projectile/beam/cyan
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien // Self charges.
|
||||
origin_tech = list(TECH_COMBAT = 8, TECH_MAGNET = 7)
|
||||
modifystate = "alienpistol"
|
||||
|
||||
|
||||
/*
|
||||
* Antique Laser Gun
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/captain
|
||||
name = "antique laser gun"
|
||||
icon_state = "caplaser"
|
||||
@@ -167,6 +158,9 @@
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge/captain
|
||||
battery_lock = 1
|
||||
|
||||
/*
|
||||
* Laser Cannon
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/lasercannon
|
||||
name = "laser cannon"
|
||||
desc = "With the laser cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron \
|
||||
@@ -195,6 +189,9 @@
|
||||
charge_cost = 400
|
||||
fire_delay = 20
|
||||
|
||||
/*
|
||||
* X-ray
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/xray
|
||||
name = "xray laser gun"
|
||||
desc = "A high-power laser gun capable of expelling concentrated xray blasts, which are able to penetrate matter easier than \
|
||||
@@ -205,6 +202,9 @@
|
||||
projectile_type = /obj/item/projectile/beam/xray
|
||||
charge_cost = 200
|
||||
|
||||
/*
|
||||
* Marksman Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/sniperrifle
|
||||
name = "marksman energy rifle"
|
||||
desc = "The HI DMR 9E is an older design of Hephaestus Industries. A designated marksman rifle capable of shooting powerful \
|
||||
@@ -237,18 +237,93 @@
|
||||
|
||||
toggle_scope(2.0)
|
||||
|
||||
/*
|
||||
* Laser Scattergun (proof of concept)
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/lasershotgun
|
||||
name = "laser scattergun"
|
||||
icon = 'icons/obj/energygun.dmi'
|
||||
item_state = "laser"
|
||||
icon_state = "scatter"
|
||||
desc = "A strange Almachi weapon, utilizing a refracting prism to turn a single laser blast into a diverging cluster."
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 1, TECH_MATERIAL = 4)
|
||||
|
||||
projectile_type = /obj/item/projectile/scatter/laser
|
||||
|
||||
/*
|
||||
* Imperial Pistol
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/imperial
|
||||
name = "imperial energy pistol"
|
||||
desc = "An elegant weapon developed by the Imperium Auream. Their weaponsmiths have cleverly found a way to make a gun that \
|
||||
is only about the size of an average energy pistol, yet with the fire power of a laser carbine."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_override = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "ge_pistol"
|
||||
item_state = "ge_pistol"
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
force = 10
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2)
|
||||
matter = list(MAT_STEEL = 2000)
|
||||
fire_sound = 'sound/weapons/mandalorian.ogg'
|
||||
projectile_type = /obj/item/projectile/beam/imperial
|
||||
|
||||
/*
|
||||
* Mining-Laser Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/mininglaser
|
||||
name = "mining-laser rifle"
|
||||
desc = "An industrial grade mining laser. Comes with a built-in 'stun' mode for encounters with local wildlife."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "mininglaser"
|
||||
item_state = "mininglaser"
|
||||
fire_delay = 8
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 15
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
||||
matter = list(MAT_STEEL = 2000)
|
||||
projectile_type = /obj/item/projectile/beam/mininglaser
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="mining", fire_delay=8, projectile_type=/obj/item/projectile/beam/mininglaser, charge_cost = 200),
|
||||
list(mode_name="deter", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 80),
|
||||
)
|
||||
|
||||
/*
|
||||
* Old Laser Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/laser/old
|
||||
name = "vintage laser rifle"
|
||||
desc = "A Hephaestus Industries G32E rifle, designed to kill with concentrated energy blasts. This older model laser rifle only has one firemode."
|
||||
description_fluff = "The leading arms producer in the SCG, Hephaestus typically only uses its 'top level' branding for its military-grade \
|
||||
equipment used by armed forces across human space."
|
||||
icon_state = "oldlaser"
|
||||
item_state = "laser"
|
||||
fire_delay = 6
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
force = 8
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 1) //Older rifle - less tech
|
||||
matter = list(MAT_STEEL = 1500)
|
||||
projectile_type = /obj/item/projectile/beam/midlaser
|
||||
|
||||
/*
|
||||
* Mono-Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/monorifle
|
||||
name = "antique mono-rifle"
|
||||
desc = "An old laser rifle. This one can only fire once before requiring recharging."
|
||||
description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say."
|
||||
icon = 'icons/obj/energygun.dmi'
|
||||
desc = "An old model laser rifle with a nice wood finish. This weapon was only designed to fire once before requiring a recharge."
|
||||
description_fluff = "Modeled after ancient hunting rifles designs, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as the \
|
||||
choice \"fight-stopper\" of barkeeps. One shot is all it takes... so they say."
|
||||
icon_state = "mono"
|
||||
item_state = "shotgun"
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3)
|
||||
projectile_type = /obj/item/projectile/beam/sniper
|
||||
slot_flags = SLOT_BACK
|
||||
action_button_name = "Aim Down Sights"
|
||||
charge_cost = 1300
|
||||
charge_cost = 2400
|
||||
fire_delay = 20
|
||||
force = 8
|
||||
w_class = ITEMSIZE_LARGE
|
||||
@@ -269,23 +344,12 @@
|
||||
|
||||
/obj/item/weapon/gun/energy/monorifle/combat
|
||||
name = "combat mono-rifle"
|
||||
desc = "A modernized version of the mono-rifle. This one can fire twice before requiring recharging."
|
||||
description_fluff = "A modern design produced by a small company operating out of Saint Columbia, based on the antique mono-rifle 'Rainy Day Special' design."
|
||||
desc = "A modernized version of the classic mono-rifle. This one has an optimized capacitor bank that allows the rifle to fire twice before requiring a recharge."
|
||||
description_fluff = "A modern design of a classic rifle produced by a small arms company operating out of Saint Columbia. It was based on the \
|
||||
antique mono-rifle design that was dubbed the 'Rainy Day Special' by many of its users."
|
||||
icon_state = "cmono"
|
||||
item_state = "cshotgun"
|
||||
charge_cost = 1000
|
||||
charge_cost = 1200
|
||||
force = 12
|
||||
accuracy = 0
|
||||
scoped_accuracy = 20
|
||||
|
||||
// Laser scattergun, proof of concept.
|
||||
|
||||
/obj/item/weapon/gun/energy/lasershotgun
|
||||
name = "laser scattergun"
|
||||
icon = 'icons/obj/energygun.dmi'
|
||||
item_state = "laser"
|
||||
icon_state = "scatter"
|
||||
desc = "A strange Almachi weapon, utilizing a refracting prism to turn a single laser blast into a diverging cluster."
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 1, TECH_MATERIAL = 4)
|
||||
|
||||
projectile_type = /obj/item/projectile/scatter/laser
|
||||
scoped_accuracy = 20
|
||||
@@ -3,8 +3,10 @@
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/gun
|
||||
name = "energy gun"
|
||||
desc = "Another bestseller of Lawson Arms, the LAEP80 Thor is a versatile energy based pistol, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
|
||||
description_fluff = "Lawson Arms is Hephaestus Industries’ main personal-energy-weapon branding, often sold alongside MarsTech projectile weapons to security and law enforcement agencies."
|
||||
desc = "Another bestseller of Lawson Arms, the LAEP80 Thor is a versatile energy based pistol, capable of switching between low and high \
|
||||
capacity projectile settings. In other words: Stun or Kill."
|
||||
description_fluff = "Lawson Arms is Hephaestus Industries’ main personal-energy-weapon branding, often sold alongside MarsTech projectile \
|
||||
weapons to security and law enforcement agencies."
|
||||
icon_state = "egunstun"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
fire_delay = 8
|
||||
@@ -23,7 +25,8 @@
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/gun/rifle
|
||||
name = "energy rifle"
|
||||
desc = "Another bestseller of Lawson Arms, the LAEP100 Svarog is a versatile energy rifle, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
|
||||
desc = "Another bestseller of Lawson Arms, the LAEP100 Svarog is a versatile energy rifle, capable of switching between low and high capacity \
|
||||
projectile settings. In other words: Stun or Kill."
|
||||
icon_state = "riflestun"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
wielded_item_state = "riflestun-wielded"
|
||||
@@ -46,7 +49,8 @@
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/gun/burst
|
||||
name = "energy carbine"
|
||||
desc = "The Lawson Arms FM-2t is a versatile energy based carbine made from modifying the original LAEP100 design. It is capable of switching between stun or kill with a three round burst option for both settings."
|
||||
desc = "The Lawson Arms FM-2t is a versatile energy based carbine made from modifying the original LAEP100 design. It is capable of switching \
|
||||
between stun or kill with a three round burst option for both settings."
|
||||
icon_state = "energystun"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
force = 8
|
||||
@@ -64,14 +68,40 @@
|
||||
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill"),
|
||||
)
|
||||
|
||||
/*
|
||||
* Energy Thompson (RCW)
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/gun/etommy
|
||||
name = "Energy RCW"
|
||||
desc = "The Lawson Arms experimental Rapid Capacitor Weapon is a highly reguarded and deadly peice of military hardware. Using a large drum shaped \
|
||||
capacitor bank the weapon is capable of accurate, rapid burst fire."
|
||||
description_fluff = "The Rapid Capacitor Weapon is one of a few weapons that never saw full production. IT was an experimental Shock Trooper weapon developed by \
|
||||
Lawsom Arms during the Hegemony Conflict. While only a few hundred were made it didn't take long for smaller arms dealers to break apart stolen units and revese engineer \
|
||||
the tech used in their design. While they're an uncommon sight, they're known to be used by roving bands in the Salthan Fyrds as a forms of personal protection because \
|
||||
of their ease of use and firepower."
|
||||
icon_state = "etommy"
|
||||
item_state = "fm-2tkill"
|
||||
force = 8
|
||||
w_class = ITEMSIZE_LARGE
|
||||
fire_delay = 7
|
||||
|
||||
projectile_type = /obj/item/projectile/beam/burstlaser
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, charge_cost = 200),
|
||||
list(mode_name="lethal burst", burst=4, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser),
|
||||
)
|
||||
|
||||
/*
|
||||
* Energy PDW (Martin)
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/gun/compact
|
||||
name = "personal energy weapon"
|
||||
desc = "The RayZar EW20 \"Martin\" personal energy weapon - or PEW - is Ward-Takahasi's entry into the variable capacity energy gun market. New users are advised to 'set RayZars to stun'."
|
||||
description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market."
|
||||
|
||||
desc = "The RayZar EW20 \"Martin\" personal energy weapon - or PEW - is Ward-Takahasi's entry into the variable capacity energy gun market. \
|
||||
New users are advised to 'set RayZars to stun'."
|
||||
description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist \
|
||||
energy weapons of various types and quality primarily for the civilian market."
|
||||
icon_state = "PDWstun"
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
w_class = ITEMSIZE_SMALL
|
||||
@@ -89,7 +119,8 @@
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/gun/eluger
|
||||
name = "energy Luger"
|
||||
desc = "The finest sidearm produced by RauMauser. Although its battery cannot be removed, its ergonomic design makes it easy to shoot, allowing for rapid follow-up shots. It also has the ability to toggle between stun and kill."
|
||||
desc = "The finest sidearm produced by RauMauser. Although its battery cannot be removed, its ergonomic design makes it easy to shoot, allowing \
|
||||
for rapid follow-up shots. It also has the ability to toggle between stun and kill."
|
||||
icon_state = "ep08stun"
|
||||
item_state = "gun"
|
||||
fire_delay = null // Lugers are quite comfortable to shoot, thus allowing for more controlled follow-up shots. Rate of fire similar to a laser carbine.
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
/*
|
||||
* Pulse Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/pulse_rifle
|
||||
name = "pulse rifle"
|
||||
desc = "A weapon that uses advanced pulse-based beam generation technology to emit powerful laser blasts. Because of its complexity and cost, it is rarely seen in use except by specialists."
|
||||
name = "\improper LP1 Locust Rifle"
|
||||
desc = "The Bishamonten LP1 is a weapon that uses advanced pulse-based beam generation technology to emit powerful laser blasts. \
|
||||
Because of its complexity and cost, it is rarely seen in use except by specialists."
|
||||
icon_state = "pulse"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
force = 10
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
charge_cost = 120
|
||||
fire_delay = 8
|
||||
sel_mode = 2
|
||||
|
||||
firemodes = list(
|
||||
@@ -19,30 +24,54 @@
|
||||
self_recharge = 1
|
||||
use_external_power = 1
|
||||
|
||||
/*
|
||||
* Pulse Destroyer
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/pulse_rifle/destroyer
|
||||
name = "pulse destroyer"
|
||||
desc = "A heavy-duty, pulse-based energy weapon. Because of its complexity and cost, it is rarely seen in use except by specialists."
|
||||
name = "\improper LP1 MkII"
|
||||
desc = "A more heavy-duty version of the Bishamonten LP1. It's had all its safety functions ripped out to facilitate the perfect killing machine."
|
||||
icon_state = "pulsedest"
|
||||
projectile_type=/obj/item/projectile/beam/pulse
|
||||
charge_cost = 120
|
||||
fire_delay = 12
|
||||
|
||||
/obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob)
|
||||
to_chat(user, "<span class='warning'>[src.name] has three settings, and they are all DESTROY.</span>")
|
||||
|
||||
/*
|
||||
* Pulse Carbine
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/pulse_rifle/carbine
|
||||
name = "\improper LP2 Grasshopper Carbine"
|
||||
desc = "The Bishamonten LP2 is a sleek, compact version of the LP1. Because of its smaller design it takes less time to charge a shot."
|
||||
icon_state = "pulsecarbine"
|
||||
charge_cost = 480
|
||||
fire_delay = 2
|
||||
|
||||
//non-bus version because it looks adorable.
|
||||
firemodes = list(
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_delay=null, charge_cost = 120),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_delay=null, charge_cost = 120),
|
||||
list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_delay=null, charge_cost = 240),
|
||||
)
|
||||
|
||||
/*
|
||||
* Pulse Pistol
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/pulse_rifle/compact
|
||||
name = "\improper LP2 Grasshopper Compact"
|
||||
desc = "You feel like you're going to break the damn thing. The Bishamonten LP2 is a rare collectors item from the early 23rd century."
|
||||
description_fluff = "The Bishamonten Company operated from roughly 2150-2280 - the height of the first extrasolar colonisation boom - before filing for bankruptcy and selling off its assets to various companies that would go on to become today’s TSCs. \
|
||||
Focused on sleek ‘futurist’ designs which have largely fallen out of fashion but remain popular with collectors and people hoping to make some quick thalers from replica weapons. \
|
||||
Bishamonten weapons tended to be form over function - despite their flashy looks, most were completely unremarkable one way or another as weapons and used very standard firing mechanisms.\
|
||||
The Grasshopper remains one of the smallest production laser pistols ever produced that is still capable of causing significant damage to organic tissue."
|
||||
name = "\improper LP4 Mantis Compact"
|
||||
desc = "The Bishamonten LP4 was once the weapon of choice for military officers during the Hegemony War. Today it is little more than a collectors item."
|
||||
description_fluff = "The Bishamonten Company operated from roughly 2150-2280 - the height of the first extrasolar colonisation boom - before filing for \
|
||||
bankruptcy and selling off its assets to various companies that would go on to become today’s TSCs. Focused on sleek ‘futurist’ designs which have \
|
||||
largely fallen out of fashion but remain popular with collectors and people hoping to make some quick thalers from replica weapons. Bishamonten weapons \
|
||||
tended to be form over function - despite their flashy looks, most were completely unremarkable one way or another as weapons and used very standard \
|
||||
firing mechanisms.The Grasshopper remains one of the smallest production laser pistols ever produced that is still capable of causing significant \
|
||||
damage to organic tissue."
|
||||
slot_flags = SLOT_BELT|SLOT_HOLSTER
|
||||
icon_state = "lpistol"
|
||||
icon_state = "pulsepistol"
|
||||
charge_cost = 480
|
||||
|
||||
/obj/item/weapon/gun/energy/pulse_rifle/compact/admin
|
||||
name = "\improper LP2 Grasshopper Deluxe"
|
||||
name = "\improper LP4 Mantis Deluxe"
|
||||
desc = "It's not the size of the gun, it's the size of the hole it puts through people."
|
||||
charge_cost = 240
|
||||
|
||||
|
||||
@@ -1,119 +1,19 @@
|
||||
/* TUTORIAL
|
||||
"icon" is the file with the HUD/ground icon for the item
|
||||
"icon_state" is the iconstate in this file for the item
|
||||
"icon_override" is the file with the on-mob icons, can be the same file
|
||||
"item_state" is the iconstate for the on-mob icons:
|
||||
item_state_s is used for worn uniforms on mobs
|
||||
item_state_r and item_state_l are for being held in each hand
|
||||
/* Contains the weapons that are station locked for expeditions
|
||||
* and can be hand pumped to charge their battery.
|
||||
*
|
||||
* Contains:
|
||||
* Gun Locking Mechanism
|
||||
* Expedition Frontier Phaser
|
||||
* Expedition Frontier Carbine
|
||||
* Expedition Frontier Rifle
|
||||
* Holdout Phaser Pistol
|
||||
* Holdout Phaser Bow
|
||||
*/
|
||||
|
||||
"item_state_slots" can replace "item_state", it is a list:
|
||||
item_state_slots["slotname1"] = "item state for that slot"
|
||||
item_state_slots["slotname2"] = "item state for that slot"
|
||||
|
||||
on guns, in particular:
|
||||
item_state being null makes it look for exactly the icon_state in the on-mob file,
|
||||
including any 0,75,etc appended from the energy bar setting
|
||||
item_state being present prevents different mode sprites, sadly, but you may
|
||||
be able to override this on the gun itself with a proc
|
||||
*/
|
||||
|
||||
/* TEMPLATE
|
||||
//ckey:Character Name
|
||||
/obj/item/weapon/gun/type/fluff/charactername
|
||||
name = ""
|
||||
desc = ""
|
||||
|
||||
icon = 'icons/vore/custom_guns_vr.dmi'
|
||||
icon_state = "myicon"
|
||||
|
||||
icon_override = 'icons/vore/custom_guns_vr.dmi'
|
||||
item_state = "myicon"
|
||||
|
||||
*/
|
||||
|
||||
// For general use
|
||||
/obj/item/weapon/gun/energy/imperial
|
||||
name = "imperial energy pistol"
|
||||
desc = "An elegant weapon developed by the Imperium Auream. Their weaponsmiths have cleverly found a way to make a gun that is only about the size of an average energy pistol, yet with the fire power of a laser carbine."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_override = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "ge_pistol"
|
||||
item_state = "ge_pistol"
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
force = 10
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2)
|
||||
matter = list(MAT_STEEL = 2000)
|
||||
fire_sound = 'sound/weapons/mandalorian.ogg'
|
||||
projectile_type = /obj/item/projectile/beam/imperial
|
||||
|
||||
// Removed because gun64_vr.dmi guns don't work.
|
||||
/*
|
||||
//-----------------------G44 Energy Variant--------------------
|
||||
/obj/item/weapon/gun/energy/gun/burst/g44e
|
||||
name = "G44 Energy Rifle"
|
||||
desc = "The G44 Energy is a laser variant of the G44 lightweight assault rifle manufactured by the National Armory of Gaia. Though almost exclusively to the United Federation's Military Assault Command Operations Department (MACOs) and Starfleet, it is occassionally sold to security departments for their stun capabilities."
|
||||
icon = 'icons/obj/gun64_vr.dmi'
|
||||
icon_state = "g44estun100"
|
||||
item_state = "energystun100" //This is temporary.
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
charge_cost = 100
|
||||
force = 8
|
||||
w_class = ITEMSIZE_LARGE
|
||||
fire_delay = 6
|
||||
pixel_x = -16
|
||||
|
||||
projectile_type = /obj/item/projectile/beam/stun/weak
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3)
|
||||
modifystate = "g44estun"
|
||||
|
||||
one_handed_penalty = 60
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="g44estun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 100),
|
||||
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="g44estun", fire_sound='sound/weapons/Taser.ogg'),
|
||||
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="g44ekill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 200),
|
||||
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="g44ekill", fire_sound='sound/weapons/Laser.ogg'),
|
||||
)
|
||||
*/
|
||||
|
||||
//////////////////// Energy Weapons ////////////////////
|
||||
|
||||
// ------------ Energy Luger ------------
|
||||
//MOVED TO nuclear.dm
|
||||
|
||||
//////////////////// Eris Ported Guns ////////////////////
|
||||
//HoP gun
|
||||
/obj/item/weapon/gun/energy/gun/martin
|
||||
name = "holdout energy gun"
|
||||
desc = "The FS PDW E \"Martin\" is small holdout e-gun. Don't miss!"
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "PDW"
|
||||
item_state = "gun"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
projectile_type = /obj/item/projectile/beam/stun
|
||||
charge_cost = 1200
|
||||
charge_meter = 0
|
||||
modifystate = null
|
||||
battery_lock = 1
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
||||
firemodes = list(
|
||||
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', charge_cost = 600),
|
||||
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', charge_cost = 1200),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/martin/proc/update_mode()
|
||||
var/datum/firemode/current_mode = firemodes[sel_mode]
|
||||
switch(current_mode.name)
|
||||
if("stun") add_overlay("taser_pdw")
|
||||
if("lethal") add_overlay("lazer_pdw")
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/martin/update_icon()
|
||||
cut_overlays()
|
||||
update_mode()
|
||||
|
||||
//Gun Locking Mechanism
|
||||
* Gun Locking Mechanism
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/locked
|
||||
req_access = list(access_armory) //for toggling safety
|
||||
var/locked = 1
|
||||
@@ -145,13 +45,19 @@
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
////////////////Expedition Frontier Phaser////////////////
|
||||
|
||||
/*
|
||||
* Expedition Frontier Phaser
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/locked/frontier
|
||||
name = "frontier phaser"
|
||||
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = "The NT Brand Model E2 Secured Phaser System, a specialty phaser that has an intergrated chip that prevents the user from opperating the weapon within the vicinity of any NanoTrasen opperated outposts/stations/bases. However, this chip can be disabled so the weapon CAN BE used in the vicinity of any NanoTrasen opperated outposts/stations/bases. The weapon doesn't use traditional weapon power cells and instead works via a pump action that recharges the internal cells. It is a staple amongst exploration personell who usually don't have the license to opperate a lethal weapon through NT and provides them with a weapon that can be recharged away from civilization."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank \
|
||||
charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = "The NT Brand Model E2 Secured Phaser System, a specialty phaser that has an intergrated chip that prevents \
|
||||
the user from opperating the weapon within the vicinity of any NanoTrasen opperated outposts/stations/bases. However, this chip \
|
||||
can be disabled so the weapon CAN BE used in the vicinity of any NanoTrasen opperated outposts/stations/bases. The weapon doesn't \
|
||||
use traditional weapon power cells and instead works via a pump action that recharges the internal cells. It is a staple amongst \
|
||||
exploration personell who usually don't have the license to opperate a lethal weapon through NT and provides them with a weapon \
|
||||
that can be recharged away from civilization."
|
||||
icon_state = "phaserkill"
|
||||
item_state = "phaser"
|
||||
item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', "slot_belt" = 'icons/inventory/belt/mob_vr.dmi')
|
||||
@@ -206,27 +112,35 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/unlocked
|
||||
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization."
|
||||
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a \
|
||||
built-in crank charger for recharging away from civilization."
|
||||
req_access = newlist() //for toggling safety
|
||||
locked = 0
|
||||
lockable = 0
|
||||
|
||||
////////////////Phaser Carbine////////////////
|
||||
|
||||
/*
|
||||
* Expedition Frontier Carbine
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/locked/frontier/carbine
|
||||
name = "frontier carbine"
|
||||
desc = "An ergonomically improved version of the venerable frontier phaser, the carbine is a fairly new weapon, and has only been produced in limited numbers so far. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = "The NT Brand Model AT2 Secured Phaser System, a specialty phaser that has an intergrated chip that prevents the user from opperating the weapon within the vicinity of any NanoTrasen opperated outposts/stations/bases. However, this chip can be disabled so the weapon CAN BE used in the vicinity of any NanoTrasen opperated outposts/stations/bases. The weapon doesn't use traditional weapon power cells and instead works via a pump action that recharges the internal cells. It is a staple amongst exploration personell who usually don't have the license to opperate a lethal weapon through NT and provides them with a weapon that can be recharged away from civilization."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "carbinekill"
|
||||
desc = "An ergonomically improved version of the venerable frontier phaser, the carbine is a fairly new weapon, and has only been \
|
||||
produced in limited numbers so far. Includes a built-in crank charger for recharging away from civilization. This one has a safety \
|
||||
interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = "The NT Brand Model AT2 Secured Phaser System, a specialty phaser that has an intergrated chip that prevents \
|
||||
the user from opperating the weapon within the vicinity of any NanoTrasen opperated outposts/stations/bases. However, this chip can \
|
||||
be disabled so the weapon CAN BE used in the vicinity of any NanoTrasen opperated outposts/stations/bases. The weapon doesn't use \
|
||||
traditional weapon power cells and instead works via a pump action that recharges the internal cells. It is a staple amongst exploration \
|
||||
personell who usually don't have the license to opperate a lethal weapon through NT and provides them with a weapon that can be \
|
||||
recharged away from civilization."
|
||||
icon_state = "phcarbinekill"
|
||||
item_state = "energykill"
|
||||
item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_guns.dmi', slot_r_hand_str = 'icons/mob/items/righthand_guns.dmi')
|
||||
phase_power = 150
|
||||
|
||||
modifystate = "carbinekill"
|
||||
modifystate = "phcarbinekill"
|
||||
firemodes = list(
|
||||
list(mode_name="lethal", fire_delay=8, projectile_type=/obj/item/projectile/beam/blue, modifystate="carbinekill", charge_cost = 300),
|
||||
list(mode_name="low-power", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="carbinestun", charge_cost = 100),
|
||||
list(mode_name="lethal", fire_delay=8, projectile_type=/obj/item/projectile/beam/blue, modifystate="phcarbinekill", charge_cost = 300),
|
||||
list(mode_name="low-power", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="phcarbinestun", charge_cost = 100),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/carbine/update_icon()
|
||||
@@ -237,44 +151,28 @@
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/carbine/unlocked
|
||||
desc = "An ergonomically improved version of the venerable frontier phaser, the carbine is a fairly new weapon, and has only been produced in limited numbers so far. Includes a built-in crank charger for recharging away from civilization."
|
||||
desc = "An ergonomically improved version of the venerable frontier phaser, the carbine is a fairly new weapon, and has only been \
|
||||
produced in limited numbers so far. Includes a built-in crank charger for recharging away from civilization."
|
||||
req_access = newlist() //for toggling safety
|
||||
locked = 0
|
||||
lockable = 0
|
||||
|
||||
////////////////Expeditionary Holdout Phaser Pistol////////////////
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/holdout
|
||||
name = "holdout frontier phaser"
|
||||
desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "holdoutkill"
|
||||
item_state = null
|
||||
phase_power = 100
|
||||
|
||||
w_class = ITEMSIZE_SMALL
|
||||
charge_cost = 600
|
||||
modifystate = "holdoutkill"
|
||||
firemodes = list(
|
||||
list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam/blue, modifystate="holdoutkill", charge_cost = 600),
|
||||
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="holdoutstun", charge_cost = 200),
|
||||
list(mode_name="stun", fire_delay=12, projectile_type=/obj/item/projectile/beam/stun/med, modifystate="holdoutshock", charge_cost = 300),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/holdout/unlocked
|
||||
desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for recharging away from civilization."
|
||||
req_access = newlist() //for toggling safety
|
||||
locked = 0
|
||||
lockable = 0
|
||||
|
||||
////////////////Phaser Rifle////////////////
|
||||
|
||||
/*
|
||||
* Expedition Frontier Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/locked/frontier/rifle
|
||||
name = "frontier marksman rifle"
|
||||
desc = "A much larger, heavier weapon than the typical frontier-type weapons, this DMR can be fired both from the hip, and in scope. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "riflekill"
|
||||
item_state = "sniper"
|
||||
desc = "A much larger, heavier weapon than the typical frontier-type weapons, this DMR can be fired both from the hip, and in scope. \
|
||||
Includes a built-in crank charger for recharging away from civilization. Unlike other frontier-type weapons, this model lacks a non-lethal option. \
|
||||
This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = "The NT Brand Model LR10 Secured Phaser System, a specialty phaser that has an intergrated chip that prevents \
|
||||
the user from opperating the weapon within the vicinity of any NanoTrasen opperated outposts/stations/bases. However, this chip can \
|
||||
be disabled so the weapon CAN BE used in the vicinity of any NanoTrasen opperated outposts/stations/bases. The weapon doesn't use \
|
||||
traditional weapon power cells and instead works via a pump action that recharges the internal cells. It is a staple amongst exploration \
|
||||
personell who usually don't have the license to opperate a lethal weapon through NT and provides them with a weapon that can be \
|
||||
recharged away from civilization."
|
||||
icon_state = "phrifledmr"
|
||||
item_state = "lsniper"
|
||||
item_state_slots = list(slot_r_hand_str = "lsniper", slot_l_hand_str = "lsniper")
|
||||
wielded_item_state = "lsniper-wielded"
|
||||
action_button_name = "Use Scope"
|
||||
@@ -286,10 +184,10 @@
|
||||
phase_power = 150 //efficient crank charger
|
||||
|
||||
projectile_type = /obj/item/projectile/beam/sniper
|
||||
modifystate = "riflekill"
|
||||
modifystate = "phrifledmr"
|
||||
firemodes = list(
|
||||
list(mode_name="sniper", fire_delay=35, projectile_type=/obj/item/projectile/beam/sniper, modifystate="riflekill", charge_cost = 600),
|
||||
list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam, modifystate="riflestun", charge_cost = 200),
|
||||
list(mode_name="sniper", fire_delay=35, projectile_type=/obj/item/projectile/beam/sniper, modifystate="phrifledmr", charge_cost = 600),
|
||||
list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam, modifystate="phriflekill", charge_cost = 200),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/rifle/ui_action_click()
|
||||
@@ -310,21 +208,51 @@
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/rifle/unlocked
|
||||
desc = "A much larger, heavier weapon than the typical frontier-type weapons, this DMR can be fired both from the hip, and in scope. Includes a built-in crank charger for recharging away from civilization."
|
||||
desc = "A much larger, heavier weapon than the typical frontier-type weapons, this DMR can be fired both from the hip, and in scope. \
|
||||
Unlike other frontier-type weapons, this model lacks a non-lethal option. Includes a built-in crank charger for recharging away from civilization."
|
||||
req_access = newlist() //for toggling safety
|
||||
locked = 0
|
||||
lockable = 0
|
||||
|
||||
///phaser bow///
|
||||
/*
|
||||
* Holdout Phaser Pistol
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/locked/frontier/holdout
|
||||
name = "holdout frontier phaser"
|
||||
desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for \
|
||||
recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = null
|
||||
icon_state = "holdoutkill"
|
||||
item_state = null
|
||||
phase_power = 100
|
||||
slot_flags = SLOT_BELT|SLOT_HOLSTER
|
||||
w_class = ITEMSIZE_SMALL
|
||||
charge_cost = 600
|
||||
modifystate = "holdoutkill"
|
||||
firemodes = list(
|
||||
list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam/blue, modifystate="holdoutkill", charge_cost = 600),
|
||||
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="holdoutstun", charge_cost = 200),
|
||||
list(mode_name="stun", fire_delay=12, projectile_type=/obj/item/projectile/beam/stun/med, modifystate="holdoutshock", charge_cost = 300),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/locked/frontier/holdout/unlocked
|
||||
desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in \
|
||||
crank charger for recharging away from civilization."
|
||||
req_access = newlist() //for toggling safety
|
||||
locked = 0
|
||||
lockable = 0
|
||||
|
||||
/*
|
||||
* Holdout Phaser Bow
|
||||
*/
|
||||
/obj/item/weapon/gun/energy/locked/frontier/handbow
|
||||
name = "phaser handbow"
|
||||
desc = "An minaturized weapon that fires a bolt of energy. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
desc = "An minaturized weapon that fires a bolt of energy. Includes a built-in crank charger for recharging away from civilization. \
|
||||
This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = null
|
||||
icon_state = "handbowkill"
|
||||
item_state = null
|
||||
phase_power = 100
|
||||
|
||||
w_class = ITEMSIZE_SMALL
|
||||
charge_cost = 600
|
||||
modifystate = "handbowkill"
|
||||
@@ -1,3 +1,6 @@
|
||||
/*
|
||||
* Daka SMG (Code Base)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic //This should never be spawned in, it is just here because of code necessities.
|
||||
name = "daka SMG"
|
||||
desc = "A small SMG. You really shouldn't be able to get this gun. Uses 9mm rounds."
|
||||
@@ -13,11 +16,14 @@
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)))
|
||||
|
||||
/*
|
||||
* Advanced SMG
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/advanced_smg
|
||||
name = "advanced SMG"
|
||||
desc = "An advanced submachine gun with a reflective laser optic that makes burst fire less inaccurate than other SMGs. Uses 9mm rounds."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "advanced_smg-empty"
|
||||
icon_state = "advanced_smg-e"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
load_method = MAGAZINE
|
||||
caliber = "9mm"
|
||||
@@ -33,12 +39,17 @@
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/advanced_smg/update_icon()
|
||||
..()
|
||||
icon_state = (ammo_magazine)? "advanced_smg" : "advanced_smg-empty"
|
||||
return
|
||||
if(ammo_magazine)
|
||||
icon_state = "advanced_smg"
|
||||
else
|
||||
icon_state = "advanced_smg-e"
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/advanced_smg/loaded
|
||||
magazine_type = /obj/item/ammo_magazine/m9mmAdvanced
|
||||
|
||||
/*
|
||||
* C-20r
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r
|
||||
name = "submachine gun"
|
||||
desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. It has 'Scarborough Arms - Per falcis, per pravitas', inscribed on the stock. Uses 10mm rounds."
|
||||
@@ -57,7 +68,8 @@
|
||||
auto_eject = 1
|
||||
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
|
||||
// one_handed_penalty = 15
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r/rubber
|
||||
magazine_type = /obj/item/ammo_magazine/m10mm/rubber
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r/empty
|
||||
magazine_type = null
|
||||
@@ -70,6 +82,9 @@
|
||||
icon_state = "c20r"
|
||||
return
|
||||
|
||||
/*
|
||||
* Assault Carbine (STS-35)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/sts35
|
||||
name = "assault rifle"
|
||||
desc = "The rugged Jindal Arms STS-35 is a durable automatic weapon of a make popular on the frontier worlds. Uses 5.45mm rounds."
|
||||
@@ -96,7 +111,6 @@
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15,-30), dispersion=list(0.0, 0.6, 0.6))
|
||||
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15,-30,-30,-45), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/sts35/update_icon(var/ignore_inhands)
|
||||
@@ -107,6 +121,39 @@
|
||||
icon_state = (ammo_magazine)? "arifle" : "arifle-empty"
|
||||
if(!ignore_inhands) update_held_icon()
|
||||
|
||||
/*
|
||||
* X-9mm (PDW)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/pdw
|
||||
name = "personal defense weapon"
|
||||
desc = "The X-9mm is a select-fire personal defense weapon designed in-house by Xing Private Security. It was made to compete with the WT550 Saber, \
|
||||
but never caught on with NanoTrasen. Uses 9mm rounds."
|
||||
icon_state = "pdw"
|
||||
item_state = "c20r"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
caliber = "9mm"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
|
||||
slot_flags = SLOT_BELT
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m9mmAdvanced
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mmAdvanced)
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15,-30), dispersion=list(0.0, 0.6, 0.6))
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/pdw/update_icon(var/ignore_inhands)
|
||||
..()
|
||||
if(ammo_magazine)
|
||||
icon_state = "pdw"
|
||||
else
|
||||
icon_state = "pdw-e"
|
||||
return
|
||||
|
||||
/*
|
||||
* Machine Pistol (WT550)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/wt550
|
||||
name = "machine pistol"
|
||||
desc = "The WT550 Saber is a cheap self-defense weapon mass-produced by Ward-Takahashi for paramilitary and private use. Uses 9mm rounds."
|
||||
@@ -130,15 +177,19 @@
|
||||
icon_state = "wt550"
|
||||
return
|
||||
|
||||
/*
|
||||
* Battle Rifle (Z8)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/z8
|
||||
name = "battle rifle"
|
||||
desc = "The Z8 Bulldog is an older model battle rifle, made by the now defunct Zendai Foundries. Makes you feel like an old-school badass when you hold it, even though it can only hold 10 round magazines. Uses 7.62mm rounds and has an under barrel grenade launcher."
|
||||
desc = "The Z8 Bulldog is an older model battle rifle, made by the now defunct Zendai Foundries. Makes you feel like an old-school badass when you hold it, \
|
||||
even though it can only hold 10 round magazines. Uses 7.62mm rounds and has an under barrel grenade launcher."
|
||||
description_fluff = "Zendai Foundries was a well-respected mid-sized arms company that operated until 2508, when it was acquired by Hephaestus Industries. \
|
||||
Plans to integrate the brand into wider corporate operations were brought to an abrupt halt by the SolGov-Hegemony war, and the company was left by the wayside. \
|
||||
Hephaestus still produces replacement parts for many of Zendai's most popular weapons, including the Z8 Bulldog, and a great detail remain in service."
|
||||
icon_state = "carbine" // This isn't a carbine. :T
|
||||
item_state = "z8carbine"
|
||||
wielded_item_state = "z8carbine-wielded"
|
||||
wielded_item_state = "z8bulldog-wielded"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 10
|
||||
caliber = "7.62mm"
|
||||
@@ -206,6 +257,9 @@
|
||||
/obj/item/weapon/gun/projectile/automatic/z8/empty
|
||||
magazine_type = null
|
||||
|
||||
/*
|
||||
* LMG (L6 SAW)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/l6_saw
|
||||
name = "light machine gun"
|
||||
desc = "A rather sturdily made L6 SAW with a reassuringly ergonomic pistol grip. 'Hephaestus Industries' is engraved on the reciever. Uses 5.45mm rounds. It's also compatible with magazines from STS-35 assault rifles."
|
||||
@@ -229,15 +283,6 @@
|
||||
|
||||
var/cover_open = 0
|
||||
|
||||
/* Commented out for quality control and testing.
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null, automatic = 0),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0), automatic = 0),
|
||||
list(mode_name="short bursts", burst=5, move_delay=6, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2), automatic = 0),
|
||||
list(mode_name="automatic", burst=1, fire_delay=-1, move_delay=null, burst_accuracy=null, dispersion=null, automatic = 1),
|
||||
)
|
||||
*/
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)),
|
||||
@@ -290,7 +335,7 @@
|
||||
..()
|
||||
|
||||
/*
|
||||
* Automatic Shotgun
|
||||
* Automatic Shotgun (AS-24)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/as24
|
||||
name = "automatic shotgun"
|
||||
@@ -326,13 +371,16 @@
|
||||
icon_state = "ashot-empty"
|
||||
return
|
||||
|
||||
/*
|
||||
* Uzi
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/mini_uzi
|
||||
name = "micro-smg"
|
||||
desc = "The infamous ProTek Spitz is a lightweight, compact, fast firing machine pistol. Cheaply produced under the ProTek consumer brand, the Spitz seems to find its way into every corner of the galaxy. Uses .45 rounds."
|
||||
description_fluff = "Budget-grade weapons for the budget-grade consumer! Hephaestus’ low-end brand of cheaply made, low-maintenance personal defense weapons for those who just need a handgun with absolutely no frills. \
|
||||
Early ProTek weapons were notoriously unsafe and unreliable, though more recent designs have improved somewhat - they still aren’t very good. \
|
||||
Though sold for a pittance, the profit margin is too irresistible for Hephaestus to discontinue the brand."
|
||||
icon_state = "mini-uzi"
|
||||
icon_state = "uzi"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
load_method = MAGAZINE
|
||||
caliber = ".45"
|
||||
@@ -348,10 +396,13 @@
|
||||
/obj/item/weapon/gun/projectile/automatic/mini_uzi/update_icon()
|
||||
..()
|
||||
if(ammo_magazine)
|
||||
icon_state = "mini-uzi"
|
||||
icon_state = "uzi"
|
||||
else
|
||||
icon_state = "mini-uzi-empty"
|
||||
icon_state = "uzi-e"
|
||||
|
||||
/*
|
||||
* P90 (H90K)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/p90
|
||||
name = "personal defense weapon"
|
||||
desc = "The H90K is a compact, large capacity submachine gun produced by MarsTech. Despite its fierce reputation, it still manages to feel like a toy. Uses 9mm rounds."
|
||||
@@ -374,11 +425,15 @@
|
||||
/obj/item/weapon/gun/projectile/automatic/p90/update_icon()
|
||||
icon_state = "p90smg-[ammo_magazine ? round(ammo_magazine.stored_ammo.len, 6) : "empty"]"
|
||||
|
||||
/*
|
||||
* Tommy Gun
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/tommygun
|
||||
name = "\improper Tommy Gun"
|
||||
desc = "This weapon was made famous by gangsters in the 20th century. Cybersun Industries is currently reproducing these for a target market of historic gun collectors and classy criminals. Uses .45 rounds."
|
||||
description_fluff = "Cybersun Industries is a minor arms manufacturer specialising in replica firearms from eras past. Though they offer a wide selection of made-to-order models, their products are seen as little more than novelty items to most serious collectors."
|
||||
icon_state = "tommygun"
|
||||
icon_state = "tommy"
|
||||
item_state = "stg44"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
caliber = ".45"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 5)
|
||||
@@ -393,19 +448,17 @@
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/tommygun/update_icon()
|
||||
//VOREStation Edit Start - vr sprite
|
||||
if(istype(ammo_magazine,/obj/item/ammo_magazine/m45tommy))
|
||||
icon_state = "tommygun-mag"
|
||||
item_state = icon_state
|
||||
icon_state = "tommy-mag"
|
||||
else if(istype(ammo_magazine,/obj/item/ammo_magazine/m45tommydrum))
|
||||
icon_state = "tommygun-drum"
|
||||
item_state = icon_state
|
||||
icon_state = "tommy-drum"
|
||||
else
|
||||
icon_state = "tommygun-empty"
|
||||
item_state = icon_state
|
||||
icon_state = "tommy-e"
|
||||
update_held_icon()
|
||||
//VOREStation Edit End
|
||||
|
||||
/*
|
||||
* Bullpup Rifle
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/bullpup // Admin abuse assault rifle. ToDo: Make this less shit. Maybe remove its autofire, and make it spawn with only 10 rounds at start.
|
||||
name = "bullpup rifle"
|
||||
desc = "The bullpup configured GP3000 is a battle rifle produced by Gurov Projectile Weapons LLC. It is sold almost exclusively to standing armies. Uses 7.62mm rounds."
|
||||
@@ -440,7 +493,9 @@
|
||||
if(!ignore_inhands)
|
||||
update_held_icon()
|
||||
|
||||
//Functionally a mini-uzi with slightly less terrible burst spread.
|
||||
/*
|
||||
* Combat SMG (PP3 Ten)
|
||||
*/
|
||||
/obj/item/weapon/gun/projectile/automatic/combatsmg
|
||||
name = "\improper PP3 Ten"
|
||||
desc = "The Bishamonten PP3 Ten personal defense weapon is a rare design much sought after - though more for its looks than its functionality. Uses 9mm rounds."
|
||||
|
||||
@@ -28,34 +28,6 @@
|
||||
slot_flags = SLOT_BACK
|
||||
one_handed_penalty = 60 // The weapon itself is heavy
|
||||
|
||||
// For general use
|
||||
/obj/item/weapon/gun/projectile/automatic/pdw
|
||||
name = "personal defense weapon"
|
||||
desc = "The X-9MM is a select-fire personal defense weapon designed in-house by Xing Private Security. It was made to compete with the WT550 Saber, but never caught on with NanoTrasen. Uses 9mm rounds."
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "pdw"
|
||||
item_state = "c20r" // Placeholder
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
caliber = "9mm"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
|
||||
slot_flags = SLOT_BELT
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m9mml
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mm, /obj/item/ammo_magazine/m9mml)
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15,-30), dispersion=list(0.0, 0.6, 0.6))
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/pdw/update_icon(var/ignore_inhands)
|
||||
..()
|
||||
if(istype(ammo_magazine,/obj/item/ammo_magazine/m9mm))
|
||||
icon_state = "pdw-short"
|
||||
else
|
||||
icon_state = (ammo_magazine)? "pdw" : "pdw-empty"
|
||||
if(!ignore_inhands) update_held_icon()
|
||||
|
||||
// For general use
|
||||
/obj/item/weapon/gun/projectile/automatic/stg
|
||||
name = "\improper Sturmgewehr"
|
||||
@@ -77,45 +49,6 @@
|
||||
item_state = (ammo_magazine)? "arifle" : "arifle-empty"
|
||||
if(!ignore_inhands) update_held_icon()
|
||||
|
||||
// Removed because gun64_vr.dmi guns don't work.
|
||||
/*
|
||||
//-----------------------UF-ARC----------------------------------
|
||||
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/ufarc
|
||||
name = "UF-ARC"
|
||||
desc = "The UF-ARC is a lightweight assault rifle manufactured by the National Armory of Gaia and sold almost exclusively to the United Federation's standing army, the Military Assault Command Operations Department (MACOs)."
|
||||
icon = 'icons/obj/gun64_vr.dmi'
|
||||
icon_state = "ufarc"
|
||||
icon_override = 'icons/obj/gun_vr.dmi'
|
||||
item_state = "battlerifle_i"
|
||||
item_icons = null
|
||||
pixel_x = -16
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/ufarc/update_icon(var/ignore_inhands)
|
||||
..()
|
||||
// TODO - Fix this for spriting different size magazines
|
||||
icon_state = (ammo_magazine)? "ufarc" : "ufarc-empty"
|
||||
item_state = (ammo_magazine)? "bullpup" : "bullpup-empty"
|
||||
if(!ignore_inhands) update_held_icon()
|
||||
|
||||
|
||||
|
||||
//-----------------------G44----------------------------------
|
||||
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/g44
|
||||
name = "G44 Rifle"
|
||||
desc = "The G44 is a lightweight assault rifle manufactured by the National Armory of Gaia and sold almost exclusively to the United Federation's standing army, the Military Assault Command Operations Department (MACOs)."
|
||||
icon = 'icons/obj/gun64_vr.dmi'
|
||||
icon_state = "g44"
|
||||
item_state = "bullpup"
|
||||
pixel_x = -16
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/g44/update_icon(var/ignore_inhands)
|
||||
..()
|
||||
// TODO - Fix this for spriting different size magazines
|
||||
icon_state = (ammo_magazine)? "g44" : "g44-empty"
|
||||
item_state = (ammo_magazine)? "bullpup" : "bullpup-empty"
|
||||
if(!ignore_inhands) update_held_icon()
|
||||
*/
|
||||
|
||||
//////////////////// Eris Ported Guns ////////////////////
|
||||
// No idea what this is for.
|
||||
/obj/item/weapon/gun/projectile/automatic/sol
|
||||
@@ -212,18 +145,4 @@
|
||||
|
||||
/obj/item/ammo_magazine/m9mml/ap
|
||||
name = "\improper SMG magazine (9mm armor-piercing)"
|
||||
ammo_type = /obj/item/ammo_casing/a9mm/ap
|
||||
|
||||
/* Seems to have been de-coded?
|
||||
/obj/item/ammo_magazine/m9mml/flash
|
||||
name = "\improper SMG magazine (9mm flash)"
|
||||
ammo_type = /obj/item/ammo_casing/a9mmf
|
||||
|
||||
/obj/item/ammo_magazine/m9mml/rubber
|
||||
name = "\improper SMG magazine (9mm rubber)"
|
||||
ammo_type = /obj/item/ammo_casing/a9mmr
|
||||
|
||||
/obj/item/ammo_magazine/m9mml/practice
|
||||
name = "\improper SMG magazine (9mm practice)"
|
||||
ammo_type = /obj/item/ammo_casing/a9mmp
|
||||
*/
|
||||
ammo_type = /obj/item/ammo_casing/a9mm/ap
|
||||
@@ -27,3 +27,10 @@
|
||||
else
|
||||
icon_state = "tranqgun"
|
||||
return 1
|
||||
|
||||
// This is to allow xenobio to activate slime cores via remote.
|
||||
/obj/item/projectile/bullet/chemdart/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null)
|
||||
..()
|
||||
if(blocked < 2)
|
||||
if(istype(target, /obj/item/weapon/reagent_containers/food) || istype(target, /obj/item/slime_extract))
|
||||
reagents.trans_to_obj(target, reagent_amount)
|
||||
@@ -82,10 +82,10 @@
|
||||
required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
|
||||
result_amount = 3
|
||||
|
||||
/decl/chemical_reaction/instant/space_drugs
|
||||
name = "Space Drugs"
|
||||
id = "space_drugs"
|
||||
result = "space_drugs"
|
||||
/decl/chemical_reaction/instant/bliss
|
||||
name = "Bliss"
|
||||
id = "bliss"
|
||||
result = "bliss"
|
||||
required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1)
|
||||
result_amount = 3
|
||||
|
||||
@@ -1185,7 +1185,7 @@
|
||||
name = "Talum-quem"
|
||||
id = "talum_quem"
|
||||
result = "talum_quem"
|
||||
required_reagents = list("space_drugs" = 2, "sugar" = 1, "amatoxin" = 1)
|
||||
required_reagents = list("bliss" = 2, "sugar" = 1, "amatoxin" = 1)
|
||||
result_amount = 4
|
||||
|
||||
/decl/chemical_reaction/instant/qerr_quem
|
||||
|
||||
@@ -308,11 +308,11 @@
|
||||
This one is filled with serotrotium, which causes concentrated production of the serotonin neurotransmitter in humans."
|
||||
filled_reagents = list("serotrotium" = 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bliss
|
||||
name = "illicit injector"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. \
|
||||
This one contains various illicit drugs, held inside a hypospray to make smuggling easier."
|
||||
filled_reagents = list("space_drugs" = 15)
|
||||
filled_reagents = list("bliss" = 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cryptobiolin
|
||||
name = "cryptobiolin injector"
|
||||
|
||||
@@ -91,6 +91,29 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/pill/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(is_sharp(W))
|
||||
var/obj/item/weapon/reagent_containers/powder/J = new /obj/item/weapon/reagent_containers/powder(src.loc)
|
||||
user.visible_message("<span class='warning'>[user] gently cuts up [src] with [W]!</span>")
|
||||
playsound(src.loc, 'sound/effects/chop.ogg', 50, 1)
|
||||
|
||||
if(reagents)
|
||||
reagents.trans_to_obj(J, reagents.total_volume)
|
||||
J.get_appearance()
|
||||
qdel(src)
|
||||
|
||||
if(istype(W, /obj/item/weapon/card/id))
|
||||
var/obj/item/weapon/reagent_containers/powder/J = new /obj/item/weapon/reagent_containers/powder(src.loc)
|
||||
user.visible_message("<span class='warning'>[user] clumsily chops up [src] with [W]!</span>")
|
||||
playsound(src.loc, 'sound/effects/chop.ogg', 50, 1)
|
||||
|
||||
if(reagents)
|
||||
reagents.trans_to_obj(J, reagents.total_volume)
|
||||
J.get_appearance()
|
||||
qdel(src)
|
||||
|
||||
return ..()
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Pills. END
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -294,7 +317,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/pill/happy/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("space_drugs", 15)
|
||||
reagents.add_reagent("bliss", 15)
|
||||
reagents.add_reagent("sugar", 15)
|
||||
color = reagents.get_color()
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
init_hide_identity = TRUE
|
||||
flags = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs/unidentified
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bliss/unidentified
|
||||
init_hide_identity = TRUE
|
||||
flags = 0
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
var/affects_robots = 0 // Does this chem process inside a Synth?
|
||||
|
||||
var/allergen_type // What potential allergens does this contain?
|
||||
var/allergen_factor = 1 // If the potential allergens are mixed and low-volume, they're a bit less dangerous. Needed for drinks because they're a single reagent compared to food which contains multiple seperate reagents.
|
||||
var/allergen_factor = 2 // If the potential allergens are mixed and low-volume, they're a bit less dangerous. Needed for drinks because they're a single reagent compared to food which contains multiple seperate reagents.
|
||||
|
||||
var/cup_icon_state = null
|
||||
var/cup_name = null
|
||||
@@ -171,27 +171,7 @@
|
||||
if(overdose && (volume > overdose * M?.species.chemOD_threshold) && (active_metab.metabolism_class != CHEM_TOUCH && !can_overdose_touch))
|
||||
overdose(M, alien, removed)
|
||||
if(M.species.allergens & allergen_type) //uhoh, we can't handle this!
|
||||
var/damage_severity = M.species.allergen_damage_severity*allergen_factor
|
||||
var/disable_severity = M.species.allergen_disable_severity*allergen_factor
|
||||
if(M.species.allergen_reaction & AG_TOX_DMG)
|
||||
M.adjustToxLoss(damage_severity)
|
||||
if(M.species.allergen_reaction & AG_OXY_DMG)
|
||||
M.adjustOxyLoss(damage_severity*1.5) //VOREStation Edit
|
||||
if(prob(2.5*disable_severity))
|
||||
M.emote(pick("cough","gasp","choke"))
|
||||
if(M.species.allergen_reaction & AG_EMOTE)
|
||||
if(prob(2.5*disable_severity)) //this has a higher base chance, but not *too* high
|
||||
M.emote(pick("pale","shiver","twitch"))
|
||||
if(M.species.allergen_reaction & AG_PAIN)
|
||||
M.adjustHalLoss(disable_severity*2) //VOREStation Edit
|
||||
if(M.species.allergen_reaction & AG_WEAKEN)
|
||||
M.Weaken(disable_severity)
|
||||
if(M.species.allergen_reaction & AG_BLURRY)
|
||||
M.eye_blurry = max(M.eye_blurry, disable_severity)
|
||||
if(M.species.allergen_reaction & AG_SLEEPY)
|
||||
M.drowsyness = max(M.drowsyness, disable_severity)
|
||||
if(M.species.allergen_reaction & AG_CONFUSE) //VOREStation Addition
|
||||
M.Confuse(disable_severity/4) //VOREStation Addition
|
||||
M.add_chemical_effect(CE_ALLERGEN,allergen_factor)
|
||||
remove_self(removed)
|
||||
return
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
glass_name = "ethanol"
|
||||
glass_desc = "A well-known alcohol with a variety of applications."
|
||||
allergen_factor = 0.5 //simulates mixed drinks containing less of the allergen, as they have only a single actual reagent unlike food
|
||||
allergen_factor = 1 //simulates mixed drinks containing less of the allergen, as they have only a single actual reagent unlike food
|
||||
|
||||
/datum/reagent/ethanol/touch_mob(var/mob/living/L, var/amount)
|
||||
..()
|
||||
|
||||
@@ -0,0 +1,255 @@
|
||||
/*
|
||||
/// Recreational and psychiatric drugs go here! Please keep them separated in the file.
|
||||
/// Due to concerns and safety for our repo, illegal real-world drug names should generally be avoided.
|
||||
*/
|
||||
|
||||
/datum/reagent/drugs
|
||||
name = "generic drugs"
|
||||
id = "drugs"
|
||||
description = "Some generic drugs."
|
||||
taste_description = "a bad investment"
|
||||
taste_mult = 1.2 /// The overwhelming flavor of a good(?) time!
|
||||
color = "#f2f2f2"
|
||||
var/high_messages = TRUE
|
||||
var/list/high_message_list = list("You feel great! For now...", "You feel a wave of happiness!")
|
||||
var/list/sober_message_list = list("You feel like garbage...", "Your head aches.")
|
||||
data = 0
|
||||
|
||||
var/prob_proc = FALSE /// ANY probabilities in specific drugs should check for this to be TRUE + the desired probability AND set this back to false.
|
||||
|
||||
reagent_state = LIQUID
|
||||
metabolism = REM * 0.5
|
||||
ingest_met = REM * 1.5 /// Be very careful with this, ingestion is weird and will spam high/sober messages horribly!
|
||||
mrate_static = TRUE
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
|
||||
/datum/reagent/drugs/affect_blood(mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
|
||||
if(high_messages == TRUE)
|
||||
if(world.time > data + 90 SECONDS && volume > 0.5) /// Spam prevention.
|
||||
data = world.time
|
||||
var/msg = pick(high_message_list)
|
||||
to_chat(M, "<span class='warning'>[msg]</span>")
|
||||
else if(volume <= 0.2 && data != -1)
|
||||
data = -1
|
||||
var/msg = pick(sober_message_list)
|
||||
to_chat(M, "<span class='warning'>[msg]</span>")
|
||||
if(prob(5) && prob_proc == FALSE) /// Enables procs to activate, remains true until THAT PROC sets it to false again.
|
||||
prob_proc = TRUE
|
||||
|
||||
/datum/reagent/drugs/bliss /// Replaces Space Drugs.
|
||||
name = "Bliss"
|
||||
id = "bliss"
|
||||
description = "Known for providing a euphoric high, this psychoactive drug is often used recreationally."
|
||||
taste_description = "unpleasant bitterness"
|
||||
taste_mult = 0.4
|
||||
high_message_list = list("You don't quite know what up or down is anymore...",
|
||||
"Colors just seem much more amazing.",
|
||||
"You feel incredibly confident. No one can stop you.",
|
||||
"You clench your jaw involuntarily.",
|
||||
"You feel... unsteady.",
|
||||
"You really feel like talking about your feelings!")
|
||||
sober_message_list = list("Everything feels a little more grounded.",
|
||||
"Colors seem... flatter.",
|
||||
"Everything feels a little dull, now.")
|
||||
|
||||
/datum/reagent/drugs/bliss/affect_blood(mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
var/drug_strength = 15
|
||||
if(alien == IS_SKRELL)
|
||||
drug_strength = drug_strength * 0.8
|
||||
if(alien == IS_SLIME)
|
||||
drug_strength = drug_strength * 1.2
|
||||
|
||||
M.druggy = max(M.druggy, drug_strength)
|
||||
if(prob_proc == TRUE && prob(10) && isturf(M.loc) && !istype(M.loc, /turf/space) && M.canmove && !M.restrained())
|
||||
step(M, pick(cardinal))
|
||||
prob_proc = FALSE
|
||||
if(prob_proc == TRUE && prob(7))
|
||||
M.emote(pick("twitch", "drool", "moan", "giggle"))
|
||||
prob_proc = FALSE
|
||||
|
||||
/datum/reagent/drugs/bliss/overdose(var/mob/living/M as mob)
|
||||
if(prob_proc == TRUE && prob(20))
|
||||
M.hallucination = max(M.hallucination, 5)
|
||||
prob_proc = FALSE
|
||||
M.adjustBrainLoss(0.25*REM)
|
||||
M.adjustToxLoss(0.25*REM)
|
||||
..()
|
||||
|
||||
/datum/reagent/drugs/ambrosia_extract
|
||||
name = "Ambrosia extract"
|
||||
id = "ambrosia_extract"
|
||||
description = "The extract from the plant family ambrosia, responsible for the more \"recreational\" effects."
|
||||
taste_description = "a strong-tasting plant"
|
||||
color = "#358f49"
|
||||
high_message_list = list("You feel so much more relaxed.",
|
||||
"You can't quite focus on anything.",
|
||||
"Colors around you seem much more intense.",
|
||||
"You could snack on something right now...",
|
||||
"You feel lightheaded and giggly.",
|
||||
"Everything seems so hilarious.",
|
||||
"You really could go for some takeout right now.",
|
||||
"You momentarily forget where you are.",
|
||||
"You have a mild urge to look over your shoulder.")
|
||||
sober_message_list = list("You feel the urge to just sit there and do nothing.",
|
||||
"Reality seems like a real pain in the ass to deal with right now.",
|
||||
"Things feel really colourless to you all of a sudden.",
|
||||
"You feel the urge to lie down and nap.")
|
||||
|
||||
/datum/reagent/drugs/ambrosia_extract/affect_blood(mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
var/drug_strength = 3
|
||||
if(alien == IS_SKRELL)
|
||||
drug_strength = drug_strength * 0.8
|
||||
if(alien == IS_SLIME)
|
||||
drug_strength = drug_strength * 1.2
|
||||
|
||||
M.adjustToxLoss(-2)
|
||||
M.druggy = max(M.druggy, drug_strength)
|
||||
M.heal_organ_damage(6)
|
||||
M.adjustOxyLoss(-3)
|
||||
M.AdjustStunned(-1)
|
||||
if(prob(5) && prob_proc == TRUE)
|
||||
M.emote("giggle")
|
||||
prob_proc = FALSE
|
||||
if(prob(10) && prob_proc == TRUE)
|
||||
M.adjust_nutrition(-10)
|
||||
prob_proc = FALSE
|
||||
|
||||
/datum/reagent/drugs/psilocybin
|
||||
name = "Psilocybin"
|
||||
id = "psilocybin"
|
||||
description = "A strong psycotropic derived from certain species of mushroom."
|
||||
taste_description = "mushroom"
|
||||
color = "#E700E7"
|
||||
high_message_list = list("The world distorts around you...!",
|
||||
"The walls look like they're moving...",
|
||||
"Nothing really makes sense right now.",
|
||||
"It feels like you've melded with the world around you...")
|
||||
sober_message_list = list("Everything feels... flat.", "You feel almost TOO grounded in your surroundings.")
|
||||
|
||||
/datum/reagent/drugs/psilocybin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
|
||||
var/threshold = 1 * M.species.chem_strength_tox
|
||||
if(alien == IS_SKRELL)
|
||||
threshold = 1.2
|
||||
|
||||
if(alien == IS_SLIME)
|
||||
threshold = 0.8
|
||||
|
||||
M.druggy = max(M.druggy, 30)
|
||||
|
||||
var/effective_dose = dose
|
||||
if(issmall(M)) effective_dose *= 2
|
||||
if(effective_dose < 1 * threshold)
|
||||
M.apply_effect(3, STUTTER)
|
||||
M.make_dizzy(5)
|
||||
if(prob(3) && prob_proc == TRUE)
|
||||
M.emote(pick("twitch", "giggle"))
|
||||
prob_proc = FALSE
|
||||
else if(effective_dose < 2 * threshold)
|
||||
M.apply_effect(3, STUTTER)
|
||||
M.make_jittery(5)
|
||||
M.make_dizzy(5)
|
||||
M.druggy = max(M.druggy, 35)
|
||||
if(prob(5) && prob_proc == TRUE)
|
||||
M.emote(pick("twitch", "giggle"))
|
||||
prob_proc = FALSE
|
||||
else
|
||||
M.apply_effect(3, STUTTER)
|
||||
M.make_jittery(10)
|
||||
M.make_dizzy(10)
|
||||
M.druggy = max(M.druggy, 40)
|
||||
if(prob(10) && prob_proc == TRUE)
|
||||
M.emote(pick("twitch", "giggle"))
|
||||
prob_proc = FALSE
|
||||
|
||||
/datum/reagent/drugs/talum_quem
|
||||
name = "Talum-quem"
|
||||
id = "talum_quem"
|
||||
description = " A very carefully tailored hallucinogen, for use of the Talum-Katish."
|
||||
taste_description = "bubblegum"
|
||||
taste_mult = 1.6
|
||||
color = "#db2ed8"
|
||||
high_message_list = list("The world distorts around you...!",
|
||||
"The walls look like they're moving...",
|
||||
"Nothing really makes sense right now.",
|
||||
"It feels like you've melded with the world around you...")
|
||||
sober_message_list = list("Everything feels... flat.", "You feel almost TOO grounded in your surroundings.")
|
||||
|
||||
/datum/reagent/drugs/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
|
||||
var/drug_strength = 29 * M.species.chem_strength_tox
|
||||
if(alien == IS_SKRELL)
|
||||
drug_strength = drug_strength * 0.8
|
||||
else
|
||||
M.adjustToxLoss(10 * removed) //Given incorporations of other toxins with similiar damage, this seems right.
|
||||
|
||||
M.druggy = max(M.druggy, drug_strength)
|
||||
if(prob(10) && prob_proc == TRUE && isturf(M.loc) && !istype(M.loc, /turf/space) && M.canmove && !M.restrained())
|
||||
step(M, pick(cardinal))
|
||||
prob_proc = FALSE
|
||||
if(prob(7) && prob_proc == TRUE)
|
||||
M.emote(pick("twitch", "drool", "moan", "giggle"))
|
||||
prob_proc = FALSE
|
||||
|
||||
/datum/reagent/drugs/nicotine
|
||||
name = "Nicotine"
|
||||
id = "nicotine"
|
||||
description = "A highly addictive stimulant extracted from the tobacco plant."
|
||||
taste_description = "sour staleness"
|
||||
color = "#181818"
|
||||
high_messages = FALSE
|
||||
|
||||
/*///////////////////////////////////////////////////////////////////////////
|
||||
/// PSYCHIATRIC DRUGS /////
|
||||
/// /////
|
||||
/// Psychiatric drugs use similar mechanics and will go under "drugs". /////
|
||||
*////////////////////////////////////////////////////////////////////////////
|
||||
/datum/reagent/drugs/methylphenidate
|
||||
name = "Methylphenidate"
|
||||
id = "methylphenidate"
|
||||
description = "Improves the ability to concentrate."
|
||||
taste_description = "mild grape" ///Referencing real life oral solutions for these meds.
|
||||
color = "#BF80BF"
|
||||
high_message_list = list("You feel focused.", "Your attention is undivided.")
|
||||
sober_message_list = list("It becomes harder to focus...", "You feel distractible.")
|
||||
|
||||
/datum/reagent/drugs/citalopram
|
||||
name = "Citalopram"
|
||||
id = "citalopram"
|
||||
description = "Stabilizes the mind a little."
|
||||
taste_description = "mild peppermint"
|
||||
color = "#FF80FF"
|
||||
high_message_list = list("Everything feels a bit more steady.", "Your mind feels stable.")
|
||||
sober_message_list = list("You feel a little tired.", "You feel a little more listless...")
|
||||
|
||||
/datum/reagent/drugs/paroxetine
|
||||
name = "Paroxetine"
|
||||
id = "paroxetine"
|
||||
description = "Stabilizes the mind greatly, but has a chance of adverse effects."
|
||||
taste_description = "mild oranges"
|
||||
color = "#FF80BF"
|
||||
high_message_list = list("Everything feels good, stable.", "You feel grounded.")
|
||||
sober_message_list = list("The stability is gone...", "Everything is much less stable.")
|
||||
|
||||
/datum/reagent/drugs/paroxetine/affect_blood(mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
if(prob(5) && prob_proc == TRUE)
|
||||
to_chat(M, "<span class='warning'>Everything feels out of control...</span>")
|
||||
M.hallucination += 200
|
||||
prob_proc = FALSE
|
||||
|
||||
/datum/reagent/drugs/qerr_quem
|
||||
name = "Qerr-quem"
|
||||
id = "qerr_quem"
|
||||
description = "A potent sedative and anti-anxiety medication, made for the Qerr-Katish."
|
||||
taste_description = "mint"
|
||||
color = "#e6efe3"
|
||||
high_message_list = list("You feel sluggish...", "You feel calm and collected.")
|
||||
sober_message_list = list("You feel so much more antsy...", "Your concentration wavers.")
|
||||
@@ -436,6 +436,15 @@
|
||||
nutriment_factor = 5
|
||||
color = "#302000"
|
||||
|
||||
/datum/reagent/nutriment/chocolate
|
||||
name = "Chocolate"
|
||||
id = "chocolate"
|
||||
description = "Great for cooking or on its own!"
|
||||
taste_description = "chocolate"
|
||||
color = "#582815"
|
||||
nutriment_factor = 5
|
||||
taste_mult = 1.3
|
||||
|
||||
/datum/reagent/nutriment/instantjuice
|
||||
name = "Juice Powder"
|
||||
id = "instantjuice"
|
||||
@@ -1004,6 +1013,16 @@
|
||||
..()
|
||||
M.reagents.add_reagent("imidazoline", removed * 0.2)
|
||||
|
||||
/datum/reagent/drink/juice/lettuce
|
||||
name = "Lettuce Juice"
|
||||
id = "lettucejuice"
|
||||
description = "It's mostly water, just a bit more lettucy."
|
||||
taste_description = "fresh greens"
|
||||
color = "#29df4b"
|
||||
|
||||
glass_name = "lettuce juice"
|
||||
glass_desc = "This is just lettuce water. Fresh but boring."
|
||||
|
||||
/datum/reagent/drink/juice
|
||||
name = "Grape Juice"
|
||||
id = "grapejuice"
|
||||
@@ -1092,7 +1111,7 @@
|
||||
glass_desc = "Vitamins! Yay!"
|
||||
allergen_type = ALLERGEN_FRUIT //Oranges are fruit
|
||||
|
||||
/datum/reagent/drink/orangejuice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
/datum/reagent/drink/juice/orange/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/datum/reagent/inaprovaline
|
||||
name = "Inaprovaline"
|
||||
id = "inaprovaline"
|
||||
description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients."
|
||||
description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients. Also counteracts allergic reactions."
|
||||
taste_description = "bitterness"
|
||||
reagent_state = LIQUID
|
||||
color = "#00BFFF"
|
||||
@@ -15,6 +15,7 @@
|
||||
if(alien != IS_DIONA)
|
||||
M.add_chemical_effect(CE_STABLE, 15)
|
||||
M.add_chemical_effect(CE_PAINKILLER, 10 * M.species.chem_strength_pain)
|
||||
M.remove_chemical_effect(CE_ALLERGEN)
|
||||
|
||||
/datum/reagent/inaprovaline/topical
|
||||
name = "Inaprovalaze"
|
||||
@@ -1301,8 +1302,8 @@
|
||||
//VOREstation edit. Floor polishing.
|
||||
if(istype(T, /turf/simulated))
|
||||
var/turf/simulated/S = T
|
||||
S.dirt = -50
|
||||
//VOREstation edit end
|
||||
S.dirt = -50
|
||||
//VOREstation edit end
|
||||
|
||||
/datum/reagent/sterilizine/touch_mob(var/mob/living/L, var/amount)
|
||||
..()
|
||||
@@ -1378,106 +1379,6 @@
|
||||
M.make_dizzy(5)
|
||||
M.make_jittery(5)
|
||||
|
||||
/* Antidepressants */
|
||||
|
||||
#define ANTIDEPRESSANT_MESSAGE_DELAY 5*60*10
|
||||
|
||||
/datum/reagent/methylphenidate
|
||||
name = "Methylphenidate"
|
||||
id = "methylphenidate"
|
||||
description = "Improves the ability to concentrate."
|
||||
taste_description = "bitterness"
|
||||
reagent_state = LIQUID
|
||||
color = "#BF80BF"
|
||||
metabolism = 0.01
|
||||
ingest_met = 0.25
|
||||
mrate_static = TRUE
|
||||
data = 0
|
||||
|
||||
/datum/reagent/methylphenidate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
if(volume <= 0.1 && data != -1)
|
||||
data = -1
|
||||
to_chat(M, "<span class='warning'>You lose focus...</span>")
|
||||
else
|
||||
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
|
||||
data = world.time
|
||||
to_chat(M, "<span class='notice'>Your mind feels focused and undivided.</span>")
|
||||
|
||||
/datum/reagent/citalopram
|
||||
name = "Citalopram"
|
||||
id = "citalopram"
|
||||
description = "Stabilizes the mind a little."
|
||||
taste_description = "bitterness"
|
||||
reagent_state = LIQUID
|
||||
color = "#FF80FF"
|
||||
metabolism = 0.01
|
||||
ingest_met = 0.25
|
||||
mrate_static = TRUE
|
||||
data = 0
|
||||
|
||||
/datum/reagent/citalopram/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
if(volume <= 0.1 && data != -1)
|
||||
data = -1
|
||||
to_chat(M, "<span class='warning'>Your mind feels a little less stable...</span>")
|
||||
else
|
||||
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
|
||||
data = world.time
|
||||
to_chat(M, "<span class='notice'>Your mind feels stable... a little stable.</span>")
|
||||
|
||||
/datum/reagent/paroxetine
|
||||
name = "Paroxetine"
|
||||
id = "paroxetine"
|
||||
description = "Stabilizes the mind greatly, but has a chance of adverse effects."
|
||||
taste_description = "bitterness"
|
||||
reagent_state = LIQUID
|
||||
color = "#FF80BF"
|
||||
metabolism = 0.01
|
||||
ingest_met = 0.25
|
||||
mrate_static = TRUE
|
||||
data = 0
|
||||
|
||||
/datum/reagent/paroxetine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
if(volume <= 0.1 && data != -1)
|
||||
data = -1
|
||||
to_chat(M, "<span class='warning'>Your mind feels much less stable...</span>")
|
||||
else
|
||||
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
|
||||
data = world.time
|
||||
if(prob(90))
|
||||
to_chat(M, "<span class='notice'>Your mind feels much more stable.</span>")
|
||||
else
|
||||
to_chat(M, "<span class='warning'>Your mind breaks apart...</span>")
|
||||
M.hallucination += 200
|
||||
|
||||
/datum/reagent/qerr_quem
|
||||
name = "Qerr-quem"
|
||||
id = "qerr_quem"
|
||||
description = "A potent stimulant and anti-anxiety medication, made for the Qerr-Katish."
|
||||
taste_description = "mint"
|
||||
reagent_state = LIQUID
|
||||
color = "#e6efe3"
|
||||
metabolism = 0.01
|
||||
ingest_met = 0.25
|
||||
mrate_static = TRUE
|
||||
data = 0
|
||||
|
||||
/datum/reagent/qerr_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
if(volume <= 0.1 && data != -1)
|
||||
data = -1
|
||||
to_chat(M, "<span class='warning'>You feel antsy, your concentration wavers...</span>")
|
||||
else
|
||||
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
|
||||
data = world.time
|
||||
to_chat(M, "<span class='notice'>You feel invigorated and calm.</span>")
|
||||
|
||||
// This exists to cut the number of chemicals a merc borg has to juggle on their hypo.
|
||||
/datum/reagent/healing_nanites
|
||||
name = "Restorative Nanites"
|
||||
@@ -1515,7 +1416,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#ffb500"
|
||||
overdose = REAGENTS_OVERDOSE * 0.50
|
||||
|
||||
|
||||
|
||||
/datum/reagent/earthsblood/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
M.heal_organ_damage (4 * removed, 4 * removed)
|
||||
|
||||
@@ -762,34 +762,6 @@
|
||||
|
||||
/* Drugs */
|
||||
|
||||
/datum/reagent/space_drugs
|
||||
name = "Space drugs"
|
||||
id = "space_drugs"
|
||||
description = "An illegal chemical compound used as drug."
|
||||
taste_description = "bitterness"
|
||||
taste_mult = 0.4
|
||||
reagent_state = LIQUID
|
||||
color = "#60A584"
|
||||
metabolism = REM * 0.5
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
|
||||
/datum/reagent/space_drugs/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
|
||||
var/drug_strength = 15 * M.species.chem_strength_tox
|
||||
if(alien == IS_SKRELL)
|
||||
drug_strength = drug_strength * 0.8
|
||||
|
||||
if(alien == IS_SLIME)
|
||||
drug_strength = drug_strength * 1.2
|
||||
|
||||
M.druggy = max(M.druggy, drug_strength)
|
||||
if(prob(10) && isturf(M.loc) && !istype(M.loc, /turf/space) && M.canmove && !M.restrained())
|
||||
step(M, pick(cardinal))
|
||||
if(prob(7))
|
||||
M.emote(pick("twitch", "drool", "moan", "giggle"))
|
||||
|
||||
/datum/reagent/serotrotium
|
||||
name = "Serotrotium"
|
||||
id = "serotrotium"
|
||||
@@ -892,85 +864,6 @@
|
||||
|
||||
M.hallucination = max(M.hallucination, drug_strength)
|
||||
|
||||
/datum/reagent/psilocybin
|
||||
name = "Psilocybin"
|
||||
id = "psilocybin"
|
||||
description = "A strong psycotropic derived from certain species of mushroom."
|
||||
taste_description = "mushroom"
|
||||
color = "#E700E7"
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
metabolism = REM * 0.5
|
||||
|
||||
/datum/reagent/psilocybin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
|
||||
var/threshold = 1 * M.species.chem_strength_tox
|
||||
if(alien == IS_SKRELL)
|
||||
threshold = 1.2
|
||||
|
||||
if(alien == IS_SLIME)
|
||||
threshold = 0.8
|
||||
|
||||
M.druggy = max(M.druggy, 30)
|
||||
|
||||
var/effective_dose = dose
|
||||
if(issmall(M)) effective_dose *= 2
|
||||
if(effective_dose < 1 * threshold)
|
||||
M.apply_effect(3, STUTTER)
|
||||
M.make_dizzy(5)
|
||||
if(prob(5))
|
||||
M.emote(pick("twitch", "giggle"))
|
||||
else if(effective_dose < 2 * threshold)
|
||||
M.apply_effect(3, STUTTER)
|
||||
M.make_jittery(5)
|
||||
M.make_dizzy(5)
|
||||
M.druggy = max(M.druggy, 35)
|
||||
if(prob(10))
|
||||
M.emote(pick("twitch", "giggle"))
|
||||
else
|
||||
M.apply_effect(3, STUTTER)
|
||||
M.make_jittery(10)
|
||||
M.make_dizzy(10)
|
||||
M.druggy = max(M.druggy, 40)
|
||||
if(prob(15))
|
||||
M.emote(pick("twitch", "giggle"))
|
||||
|
||||
/datum/reagent/nicotine
|
||||
name = "Nicotine"
|
||||
id = "nicotine"
|
||||
description = "A highly addictive stimulant extracted from the tobacco plant."
|
||||
taste_description = "bitterness"
|
||||
reagent_state = LIQUID
|
||||
color = "#181818"
|
||||
|
||||
/datum/reagent/talum_quem
|
||||
name = "Talum-quem"
|
||||
id = "talum_quem"
|
||||
description = " A very carefully tailored hallucinogen, for use of the Talum-Katish."
|
||||
taste_description = "bubblegum"
|
||||
taste_mult = 1.6
|
||||
reagent_state = LIQUID
|
||||
color = "#db2ed8"
|
||||
metabolism = REM * 0.5
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
|
||||
/datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
|
||||
var/drug_strength = 29 * M.species.chem_strength_tox
|
||||
if(alien == IS_SKRELL)
|
||||
drug_strength = drug_strength * 0.8
|
||||
else
|
||||
M.adjustToxLoss(10 * removed) //Given incorporations of other toxins with similiar damage, this seems right.
|
||||
|
||||
M.druggy = max(M.druggy, drug_strength)
|
||||
if(prob(10) && isturf(M.loc) && !istype(M.loc, /turf/space) && M.canmove && !M.restrained())
|
||||
step(M, pick(cardinal))
|
||||
if(prob(7))
|
||||
M.emote(pick("twitch", "drool", "moan", "giggle"))
|
||||
|
||||
/* Transformations */
|
||||
|
||||
/datum/reagent/slimetoxin
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/obj/machinery/disposal/wall/cleaner
|
||||
name = "resleeving equipment deposit"
|
||||
desc = "Automatically cleans and transports items to the local resleeving facilities."
|
||||
icon = 'icons/obj/pipes/disposal_vr.dmi'
|
||||
icon_state = "bluewall"
|
||||
|
||||
/obj/machinery/disposal/wall/cleaner/flush()
|
||||
flick("[icon_state]-flush", src)
|
||||
for(var/obj/item/i in src)
|
||||
if(istype(i, /obj/item))
|
||||
i.decontaminate()
|
||||
. = ..()
|
||||
@@ -0,0 +1,17 @@
|
||||
/datum/design/item/weapon/xenobio/monkey_gun
|
||||
name = "bluespace monkey deployment system"
|
||||
desc = "An Advanced monkey teleportation and rehydration system. For serious monkey business."
|
||||
id = "monkey_gun"
|
||||
req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4, TECH_BLUESPACE = 6)
|
||||
materials = list(MAT_PLASTEEL = 5000, MAT_GLASS = 5000, MAT_DIAMOND = 500, MAT_MORPHIUM = 350)
|
||||
build_path = /obj/item/weapon/xenobio/monkey_gun
|
||||
sort_string = "HBBA"
|
||||
|
||||
/datum/design/item/weapon/xenobio/grinder
|
||||
name = "portable slime processor"
|
||||
desc = "This high tech device combines the slime processor with the latest in woodcutting technology."
|
||||
id = "slime_grinder"
|
||||
req_tech = list(TECH_MAGNET = 4, TECH_BIO = 7)
|
||||
materials = list(MAT_STEEL = 500, MAT_GLASS = 500, MAT_DIAMOND = 500, MAT_MORPHIUM = 100)
|
||||
build_path = /obj/item/weapon/slime_grinder
|
||||
sort_string = "HBBB"
|
||||
@@ -337,7 +337,7 @@
|
||||
if(c_data)
|
||||
data = c_data
|
||||
else
|
||||
data = pick("bicaridine", "kelotane", "anti_toxin", "inaprovaline", "space_drugs", "sugar",
|
||||
data = pick("bicaridine", "kelotane", "anti_toxin", "inaprovaline", "bliss", "sugar",
|
||||
"tramadol", "dexalin", "cryptobiolin", "impedrezene", "hyperzine", "ethylredoxrazine",
|
||||
"mindbreaker", "glucose")
|
||||
var/datum/reagent/R = SSchemistry.chemical_reagents[data]
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
"Their %belly looks larger than usual.")
|
||||
|
||||
var/item_digest_mode = IM_DIGEST_FOOD // Current item-related mode from item_digest_modes
|
||||
var/contaminates = TRUE // Whether the belly will contaminate stuff
|
||||
var/contaminates = FALSE // Whether the belly will contaminate stuff
|
||||
var/contamination_flavor = "Generic" // Determines descriptions of contaminated items
|
||||
var/contamination_color = "green" // Color of contamination overlay
|
||||
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
|
||||
var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon.
|
||||
var/permit_healbelly = TRUE
|
||||
var/stumble_vore = FALSE
|
||||
var/slip_vore = FALSE
|
||||
var/drop_vore = FALSE
|
||||
var/can_be_drop_prey = FALSE
|
||||
var/can_be_drop_pred = TRUE // Mobs are pred by default.
|
||||
var/allow_spontaneous_tf = FALSE // Obviously.
|
||||
@@ -238,6 +241,9 @@
|
||||
P.allow_spontaneous_tf = src.allow_spontaneous_tf
|
||||
P.step_mechanics_pref = src.step_mechanics_pref
|
||||
P.pickup_pref = src.pickup_pref
|
||||
P.drop_vore = src.drop_vore
|
||||
P.slip_vore = src.slip_vore
|
||||
P.stumble_vore = src.stumble_vore
|
||||
|
||||
var/list/serialized = list()
|
||||
for(var/obj/belly/B as anything in src.vore_organs)
|
||||
@@ -274,6 +280,9 @@
|
||||
allow_spontaneous_tf = P.allow_spontaneous_tf
|
||||
step_mechanics_pref = P.step_mechanics_pref
|
||||
pickup_pref = P.pickup_pref
|
||||
drop_vore = P.drop_vore
|
||||
slip_vore = P.slip_vore
|
||||
stumble_vore = P.stumble_vore
|
||||
|
||||
if(bellies)
|
||||
release_vore_contents(silent = TRUE)
|
||||
@@ -939,6 +948,9 @@
|
||||
dispvoreprefs += "<b>Healbelly permission:</b> [permit_healbelly ? "Allowed" : "Disallowed"]<br>"
|
||||
dispvoreprefs += "<b>Spontaneous vore prey:</b> [can_be_drop_prey ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Spontaneous vore pred:</b> [can_be_drop_pred ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Drop Vore:</b> [drop_vore ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Slip Vore:</b> [slip_vore ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Stumble Vore:</b> [stumble_vore ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Inbelly Spawning:</b> [allow_inbelly_spawning ? "Allowed" : "Disallowed"]<br>"
|
||||
dispvoreprefs += "<b>Spontaneous transformation:</b> [allow_spontaneous_tf ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Can be stepped on/over:</b> [step_mechanics_pref ? "Allowed" : "Disallowed"]<br>"
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
return FALSE
|
||||
if(!src.vore_selected) //Gotta have one selected as well.
|
||||
return FALSE
|
||||
if(!slip_vore || !target.slip_vore)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/can_be_slip_vored_by(var/mob/living/target)
|
||||
@@ -29,6 +31,9 @@
|
||||
return FALSE
|
||||
if(!target.vore_selected) //Gotta have one selected as well.
|
||||
return FALSE
|
||||
if(!slip_vore || !target.slip_vore)
|
||||
to_chat(src,"<span class='warning'>Pred slip_vore is [target.slip_vore] Prey slip_vore is [slip_vore]</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/Crossed(var/atom/movable/AM)
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/mob/living/proc/CanStumbleVore(mob/living/target)
|
||||
if(!can_be_drop_pred)
|
||||
return FALSE
|
||||
if(!is_vore_predator(src))
|
||||
return FALSE
|
||||
if(!target.devourable)
|
||||
return FALSE
|
||||
if(!target.can_be_drop_prey)
|
||||
return FALSE
|
||||
if(!target.stumble_vore || !stumble_vore)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/Bump(atom/movable/AM)
|
||||
//. = ..()
|
||||
if(istype(AM, /mob/living))
|
||||
if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying && flight_vore)
|
||||
AM.stumble_into(src)
|
||||
return ..()
|
||||
// Because flips toggle density
|
||||
/mob/living/Crossed(var/atom/movable/AM)
|
||||
if(istype(AM, /mob/living) && isturf(loc) && AM != src)
|
||||
var/mob/living/AMV = AM
|
||||
if(((AMV.confused || AMV.is_blind()) && AMV.stat == CONSCIOUS && prob(50) && AMV.m_intent=="run") || AMV.flying && AMV.flight_vore)
|
||||
stumble_into(AMV)
|
||||
..()
|
||||
|
||||
/mob/living/stumble_into(mob/living/M)
|
||||
var/mob/living/carbon/human/S = src
|
||||
|
||||
playsound(src, "punch", 25, 1, -1)
|
||||
M.Weaken(4)
|
||||
M.stop_flying()
|
||||
if(CanStumbleVore(M))
|
||||
visible_message("<span class='warning'>[M] flops carlessly into [src]!</span>")
|
||||
perform_the_nom(src,M,src,src.vore_selected,1)
|
||||
else if(M.CanStumbleVore(src))
|
||||
visible_message("<span class='warning'>[M] flops carlessly into [src]!</span>")
|
||||
perform_the_nom(M,src,M,M.vore_selected,1)
|
||||
else if(S.species.lightweight == 1)
|
||||
visible_message("<span class='warning'>[M] carelessly bowls [src] over!</span>")
|
||||
M.forceMove(get_turf(src))
|
||||
M.apply_damage(0.5, BRUTE)
|
||||
Weaken(4)
|
||||
stop_flying()
|
||||
apply_damage(0.5, BRUTE)
|
||||
else if(round(weight) > 474)
|
||||
var/throwtarget = get_edge_target_turf(M, reverse_direction(M.dir))
|
||||
visible_message("<span class='warning'>[M] bounces backwards off of [src]'s plush body!</span>")
|
||||
M.throw_at(throwtarget, 2, 1)
|
||||
else
|
||||
visible_message("<span class='warning'>[M] trips over [src]!</span>")
|
||||
M.forceMove(get_turf(src))
|
||||
M.apply_damage(1, BRUTE)
|
||||
@@ -55,6 +55,11 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
var/allowmobvore = TRUE
|
||||
var/permit_healbelly = TRUE
|
||||
|
||||
// These are 'modifier' prefs, do nothing on their own but pair with drop_prey/drop_pred settings.
|
||||
var/drop_vore = FALSE
|
||||
var/stumble_vore = FALSE
|
||||
var/slip_vore = FALSE
|
||||
|
||||
var/resizable = TRUE
|
||||
var/show_vore_fx = TRUE
|
||||
var/step_mechanics_pref = FALSE
|
||||
@@ -143,6 +148,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
step_mechanics_pref = json_from_file["step_mechanics_pref"]
|
||||
pickup_pref = json_from_file["pickup_pref"]
|
||||
belly_prefs = json_from_file["belly_prefs"]
|
||||
drop_vore = json_from_file["drop_vore"]
|
||||
slip_vore = json_from_file["slip_vore"]
|
||||
stumble_vore = json_from_file["stumble_vore"]
|
||||
|
||||
//Quick sanitize
|
||||
if(isnull(digestable))
|
||||
@@ -177,6 +185,12 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
pickup_pref = TRUE
|
||||
if(isnull(belly_prefs))
|
||||
belly_prefs = list()
|
||||
if(isnull(drop_vore))
|
||||
drop_vore = FALSE
|
||||
if(isnull(slip_vore))
|
||||
slip_vore = FALSE
|
||||
if(isnull(stumble_vore))
|
||||
stumble_vore = FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -205,6 +219,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
"step_mechanics_pref" = step_mechanics_pref,
|
||||
"pickup_pref" = pickup_pref,
|
||||
"belly_prefs" = belly_prefs,
|
||||
"drop_vore" = drop_vore,
|
||||
"slip_vore" = slip_vore,
|
||||
"stumble_vore" = stumble_vore,
|
||||
)
|
||||
|
||||
//List to JSON
|
||||
|
||||
@@ -249,6 +249,9 @@
|
||||
"step_mechanics_active" = host.step_mechanics_pref,
|
||||
"pickup_mechanics_active" = host.pickup_pref,
|
||||
"noisy" = host.noisy,
|
||||
"drop_vore" = host.drop_vore,
|
||||
"slip_vore" = host.slip_vore,
|
||||
"stumble_vore" = host.stumble_vore,
|
||||
)
|
||||
|
||||
return data
|
||||
@@ -465,6 +468,18 @@
|
||||
host.noisy = !host.noisy
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_drop_vore")
|
||||
host.drop_vore = !host.drop_vore
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_slip_vore")
|
||||
host.slip_vore = !host.slip_vore
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_stumble_vore")
|
||||
host.stumble_vore = !host.stumble_vore
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
|
||||
/datum/vore_look/proc/pick_from_inside(mob/user, params)
|
||||
var/atom/movable/target = locate(params["pick"])
|
||||
@@ -686,7 +701,7 @@
|
||||
host.vore_selected.item_digest_mode = new_mode
|
||||
host.vore_selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change
|
||||
. = TRUE
|
||||
if("b_contaminates")
|
||||
if("b_contaminate")
|
||||
host.vore_selected.contaminates = !host.vore_selected.contaminates
|
||||
. = TRUE
|
||||
if("b_contamination_flavor")
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
/obj/item/weapon/xenobio
|
||||
name = "xenobio gun"
|
||||
desc = "You shouldn't see this!"
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
icon_state = "harpoon-2"
|
||||
var/loadable_item = null
|
||||
var/loaded_item = null
|
||||
var/loadable_name = null
|
||||
var/firable = TRUE
|
||||
/obj/item/weapon/xenobio/examine(var/mob/user)
|
||||
. = ..()
|
||||
if(loaded_item)
|
||||
.+= "A [loaded_item] is slotted into the side."
|
||||
else
|
||||
.+= "There appears to be an empty slot for attaching a [loadable_name]."
|
||||
|
||||
/obj/item/weapon/xenobio/attack_hand(mob/user as mob)
|
||||
if(user.get_inactive_hand() == src && loaded_item)
|
||||
user.put_in_hands(loaded_item)
|
||||
user.visible_message("<span class='notice'>[user] removes [loaded_item] from [src].</span>", "<span class='notice'>You remove [loaded_item] from [src].</span>")
|
||||
loaded_item = null
|
||||
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/xenobio/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, loadable_item))
|
||||
if(loaded_item)
|
||||
to_chat(user, "<span class = 'warning'>[I] doesn't seem to fit into [src].</span>")
|
||||
return
|
||||
//var/obj/item/weapon/reagent_containers/glass/beaker/B = I
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
loaded_item = I
|
||||
user.visible_message("<span class='notice'>[user] inserts [I] into [src].</span>", "<span class='notice'>You slot [I] into [src].</span>")
|
||||
return 1
|
||||
..()
|
||||
|
||||
/obj/item/weapon/xenobio/attack_self(mob/living/user as mob)
|
||||
if(loaded_item)
|
||||
user.put_in_hands(loaded_item)
|
||||
user.visible_message("<span class='notice'>[user] removes [loaded_item] from [src].</span>", "<span class='notice'>You remove [loaded_item] from [src].</span>")
|
||||
loaded_item = null
|
||||
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
|
||||
|
||||
/obj/item/weapon/xenobio/afterattack(atom/A, mob/user as mob)
|
||||
if(!loaded_item)
|
||||
to_chat(user,"<span class = 'warning'>\The [src] shot fizzles, it appears you need to load something!</span>")
|
||||
//playsound(src, 'sound/weapons/wave.ogg', 60, 1)
|
||||
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
|
||||
return
|
||||
if(!firable)
|
||||
return
|
||||
|
||||
playsound(src, 'sound/weapons/wave.ogg', 60, 1)
|
||||
|
||||
user.visible_message("<span class='warning'>[user] fires \the [src]!</span>","<span class='warning'>You fire \the [src]!</span>")
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(4, 1, A)
|
||||
s.start()
|
||||
s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(4, 1, user)
|
||||
s.start()
|
||||
|
||||
/obj/item/weapon/xenobio/monkey_gun
|
||||
name = "Bluespace Cube Rehydrator"
|
||||
desc = "Based on the technology of the 'Bluespace Harpoon' this device can teleport a loaded cube to a given target and rehydrate it."
|
||||
loadable_item = /obj/item/weapon/reagent_containers/food/snacks/monkeycube
|
||||
loadable_name = "Monkey Cube"
|
||||
origin_tech = list(TECH_BLUESPACE = 5, TECH_BIO = 6)
|
||||
//projectile_type = /obj/item/projectile/beam/xenobio/monkey
|
||||
|
||||
/obj/item/weapon/xenobio/monkey_gun/afterattack(atom/A, mob/user as mob)
|
||||
..()
|
||||
|
||||
if(!firable)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(A)
|
||||
if(!T || (T.check_density(ignore_mobs = TRUE)))
|
||||
to_chat(user,"<span class = 'warning'>Your rehydrator flashes an error as it attempts to process your target.</span>")
|
||||
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
|
||||
return
|
||||
if(istype(A, /mob/living))
|
||||
to_chat(user,"<span class = 'warning'>The rehydrator's saftey systems prevent firing into living creatures!</span>")
|
||||
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
|
||||
return
|
||||
if(loaded_item)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = loaded_item
|
||||
cube.loc = A
|
||||
cube.Expand()
|
||||
loaded_item = null
|
||||
firable = FALSE
|
||||
VARSET_IN(src, firable, TRUE, 2 SECONDS)
|
||||
|
||||
// Instead of bringing the slime to the grinder, lets bring the grinder to the slime! This will process slimes and monkies one at a time.
|
||||
/obj/item/weapon/slime_grinder
|
||||
name = "portable slime processor"
|
||||
desc = "An industrial grinder used to automate the process of slime core extraction. It can also recycle biomatter. This one appears miniturized"
|
||||
//icon = 'icons/obj/weapons_vr.dmi'
|
||||
icon_state = "chainsaw0"
|
||||
var/processing = FALSE // So I heard you like processing.
|
||||
var/list/to_be_processed = list()
|
||||
var/monkeys_recycled = 0
|
||||
description_info = "Click a monkey or slime to begin processing."
|
||||
|
||||
/obj/item/weapon/slime_grinder/proc/extract(var/atom/movable/AM, var/mob/living/user)
|
||||
processing = TRUE
|
||||
if(istype(AM, /mob/living/simple_mob/slime))
|
||||
var/mob/living/simple_mob/slime/S = AM
|
||||
while(S.cores)
|
||||
playsound(src, 'sound/machines/juicer.ogg', 25, 1)
|
||||
if(do_after(user, 15))
|
||||
new S.coretype(get_turf(AM))
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, 1)
|
||||
S.cores--
|
||||
qdel(S)
|
||||
|
||||
if(istype(AM, /mob/living/carbon/human/monkey))
|
||||
playsound(src, 'sound/machines/juicer.ogg', 25, 1)
|
||||
if(do_after(user, 15))
|
||||
var/mob/living/carbon/human/M = AM
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, 1)
|
||||
qdel(M)
|
||||
monkeys_recycled++
|
||||
sleep(1 SECOND)
|
||||
while(monkeys_recycled >= 4)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(src))
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, 1)
|
||||
monkeys_recycled -= 4
|
||||
sleep(1 SECOND)
|
||||
processing = FALSE
|
||||
|
||||
/obj/item/weapon/slime_grinder/proc/can_insert(var/atom/movable/AM)
|
||||
if(istype(AM, /mob/living/simple_mob/slime))
|
||||
var/mob/living/simple_mob/slime/S = AM
|
||||
if(S.stat != DEAD)
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(istype(AM, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(!istype(H.species, /datum/species/monkey))
|
||||
return FALSE
|
||||
if(H.stat != DEAD)
|
||||
return FALSE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/weapon/slime_grinder/attack(mob/M as mob, mob/living/user as mob)
|
||||
if(processing)
|
||||
return
|
||||
if(!can_insert(M))
|
||||
to_chat(user, "<span class='warning'>\The [src] cannot process \the [M] at this time.</span>")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
|
||||
return
|
||||
|
||||
extract(M, user)
|
||||
return ..()
|
||||
@@ -48,57 +48,57 @@
|
||||
#define MINOR_MALEABLE 1
|
||||
#define MIN_MALEABLE 0
|
||||
|
||||
var/global/list/xenoChemList = list("mutationtoxin",
|
||||
"psilocybin",
|
||||
"mindbreaker",
|
||||
"impedrezene",
|
||||
var/global/list/xenoChemList = list("mutationtoxin",
|
||||
"psilocybin",
|
||||
"mindbreaker",
|
||||
"impedrezene",
|
||||
"cryptobiolin",
|
||||
"space_drugs",
|
||||
"chloralhydrate",
|
||||
"stoxin",
|
||||
"mutagen",
|
||||
"lexorin",
|
||||
"pacid",
|
||||
"cyanide",
|
||||
"phoron",
|
||||
"plasticide",
|
||||
"amatoxin",
|
||||
"carbon",
|
||||
"radium",
|
||||
"sacid",
|
||||
"sugar",
|
||||
"kelotane",
|
||||
"dermaline",
|
||||
"anti_toxin",
|
||||
"dexalin",
|
||||
"synaptizine",
|
||||
"alkysine",
|
||||
"imidazoline",
|
||||
"peridaxon",
|
||||
"bliss",
|
||||
"chloralhydrate",
|
||||
"stoxin",
|
||||
"mutagen",
|
||||
"lexorin",
|
||||
"pacid",
|
||||
"cyanide",
|
||||
"phoron",
|
||||
"plasticide",
|
||||
"amatoxin",
|
||||
"carbon",
|
||||
"radium",
|
||||
"sacid",
|
||||
"sugar",
|
||||
"kelotane",
|
||||
"dermaline",
|
||||
"anti_toxin",
|
||||
"dexalin",
|
||||
"synaptizine",
|
||||
"alkysine",
|
||||
"imidazoline",
|
||||
"peridaxon",
|
||||
"rezadone",
|
||||
"mutationtoxin",
|
||||
"docilitytoxin")
|
||||
|
||||
|
||||
/datum/xeno/traits
|
||||
var/list/traits = list()
|
||||
var/list/chemlist = list()
|
||||
var/list/chems = list()
|
||||
var/source = "unknown"
|
||||
|
||||
|
||||
/datum/xeno/traits/proc/set_trait(var/trait, var/newval)
|
||||
traits["[trait]"] = newval
|
||||
return
|
||||
|
||||
|
||||
/datum/xeno/traits/proc/get_trait(var/trait)
|
||||
var/val = traits["[trait]"]
|
||||
return val
|
||||
|
||||
|
||||
/datum/xeno/traits/proc/copy_traits(var/datum/xeno/traits/target)
|
||||
target.traits = traits
|
||||
target.chemlist = chemlist
|
||||
target.chems = chems
|
||||
target.source = source
|
||||
|
||||
|
||||
/datum/xeno/traits/New()
|
||||
..()
|
||||
set_trait(TRAIT_XENO_COLOR, "#CACACA")
|
||||
@@ -122,15 +122,15 @@ var/global/list/xenoChemList = list("mutationtoxin",
|
||||
set_trait(TRAIT_XENO_CANSPEAK, 1)
|
||||
set_trait(TRAIT_XENO_STRENGTH, 0)
|
||||
set_trait(TRAIT_XENO_STR_RANGE, 0)
|
||||
|
||||
|
||||
/datum/xeno/traits/proc/get_gene(var/genetype)
|
||||
|
||||
|
||||
if(!genetype) return 0
|
||||
|
||||
|
||||
var/datum/xeno/genes/G = new()
|
||||
G.genetype = genetype
|
||||
G.values = list()
|
||||
|
||||
|
||||
switch(genetype)
|
||||
if(GENE_XENO_BIOCHEMISTRY)
|
||||
G.values["[TRAIT_XENO_CHEMVOL]"] = get_trait(TRAIT_XENO_CHEMVOL)
|
||||
@@ -165,18 +165,18 @@ var/global/list/xenoChemList = list("mutationtoxin",
|
||||
if(GENE_XENO_SPECIAL)
|
||||
G.values["[TRAIT_XENO_HOSTILE]"] = get_trait(TRAIT_XENO_HOSTILE)
|
||||
G.values["[TRAIT_XENO_CHROMATIC]"] = get_trait(TRAIT_XENO_CHROMATIC)
|
||||
|
||||
|
||||
return G
|
||||
|
||||
|
||||
/datum/xeno/traits/proc/apply_gene(var/datum/xeno/genes/genes)
|
||||
if(!genes.genetype) return 0
|
||||
|
||||
|
||||
switch(genes.genetype)
|
||||
if(GENE_XENO_BIOCHEMISTRY)
|
||||
set_trait(TRAIT_XENO_CHEMVOL, genes.values["[TRAIT_XENO_CHEMVOL]"])
|
||||
for(var/reagent in genes.chems)
|
||||
chems[reagent] = genes[reagent]
|
||||
|
||||
|
||||
if(GENE_XENO_HEALTH)
|
||||
set_trait(TRAIT_XENO_HEALTH, genes.values["[TRAIT_XENO_HEALTH]"])
|
||||
set_trait(TRAIT_XENO_STRENGTH, genes.values["[TRAIT_XENO_STRENGTH]"])
|
||||
@@ -207,11 +207,10 @@ var/global/list/xenoChemList = list("mutationtoxin",
|
||||
if(GENE_XENO_SPECIAL)
|
||||
set_trait(TRAIT_XENO_HOSTILE, genes.values["[TRAIT_XENO_HOSTILE]"])
|
||||
set_trait(TRAIT_XENO_CHROMATIC, genes.values["[TRAIT_XENO_CHROMATIC]"])
|
||||
|
||||
|
||||
/datum/xeno/genes
|
||||
var/genetype //Label for specifying what gene is used.
|
||||
var/list/values //What's going to be put into specific traits
|
||||
var/list/chems
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
Welcome!
|
||||
|
||||
This guide **ASSUMES** you have gone through the Guide to Opening your First PR. If you have NOT done so yet, please refer here, and ask in Discord's #ss13-development channel (For CHOMPStation), #dev-general (for VOREStation), or #code (for Polaris) if you have any questions, or need assistance with completing these steps.
|
||||
|
||||
You can also @ maintainers or staff devs, which can be viewed in the sidebar of each codebase’s Discord, and will usually have roles such as “Maintainer” (For VOREStation), “StaffDev/StaffMaintainer” (for CHOMPStation), and “Maintainer” (for Polaris).
|
||||
|
||||
[CHOMPStation]([https://github.com/CHOMPStation2/CHOMPStation2/blob/master/guides/Guide%20to%20Opening%20Your%20First%20PR.md](https://github.com/CHOMPStation2/CHOMPStation2/blob/master/guides/Guide%20to%20Opening%20Your%20First%20PR.md))
|
||||
|
||||
[VOREStation]([https://github.com/VOREStation/VOREStation/blob/master/guides/Guide%20to%20Opening%20Your%20First%20PR.md](https://github.com/VOREStation/VOREStation/blob/master/guides/Guide%20to%20Opening%20Your%20First%20PR.md))
|
||||
|
||||
[Polaris - TBD]
|
||||
|
||||
You will also WANT VSCode to edit the files, but this is not required, as DM can also do so. See Guide to VSCode/Editor Setup, or check the wiki pages on how to contribute to learn more. (These are currently TBD but will be done soon:™:)
|
||||
|
||||
Before proceeding, remember to make your branch! We should have a new branch titled “x-dev-POI”, or whatever you want to name it. We’ll assume it’s named “shep-dev-POI” for this tutorial’s context.
|
||||
|
||||
With that out of the way, congrats on getting setup! Let’s dive into how to make your first POI. \
|
||||
\
|
||||
To start, we need to open up the repo you downloaded earlier. If you’re not sure where that is, Gitkraken should be able to tell you by hovering over the codebase name, in the top left, and hitting **Alt+O** will open the file manager. \
|
||||
Either way, we should see [this]([https://i.imgur.com/FOUVK4n.png](https://i.imgur.com/FOUVK4n.png)) - Image references CHOMPStation, but the general folders should be the same for Polaris + VOREStation.
|
||||
|
||||
Before we can map, we need to setup several code prerequisites in order to actually have a new area for our map. In order to do so, we are going to locate the POI folder. We are going to add a POI to the Wilderness area for our tutorial.
|
||||
|
||||
Follow this reference: \
|
||||
Go to /maps/, and then find the folder the POIs for the given map are saved. This is code-base specific, so Polaris + CHOMP use /maps/submaps/surface_submaps/ for theirs, and then each folder (mountains, wilderness, plains) is a different area. If you’re on Southern Cross, Plains is the area around the outpost, Mountains is the mines, and Wilderness is the deep wilds. Polaris, TBD.
|
||||
|
||||
VORE has their submaps for SPECIFIC areas defined in /mapused (IE Tether)/submaps. This sub-main folder should only be used for map-specific POIs, for example, POIs that would only exist if Tether was loaded.
|
||||
|
||||
Otherwise, refer to /submaps/ and locate the folder in question. If you’re not sure, poke around, or ask in the channel for the codebase you’re currently working on for help.
|
||||
|
||||
Once we’ve gotten to the folder in question, scroll down until you see, for this reference, wilderness.dm, and wilderness_areas.dm.
|
||||
|
||||
Double click to open wilderness_areas.dm. Follow the subheadings depending on the tool you’re using.
|
||||
|
||||
VSCode: If you’ve already installed VSCode and told it to associate with .dm files as per the tutorial, it’ll open here and error. We need to open the main folder, by going to File, Open Folder, and then navigate to our base repository. This is where all the folders like maps, guides, etc are.
|
||||
|
||||
Hit Select Folder. We’ll open to a blank screen. Hit Ctrl + P to open a specific file, and type in wilderness_areas, and select wilderness_areas.dm. From here, refer to the joint section below.
|
||||
|
||||
DreamMaker: This should have opened with our filetree, as screenshotted. [https://i.imgur.com/m8FjRAs.png](https://i.imgur.com/m8FjRAs.png) If it did not, navigate to File, Open Environment, and select vorestation.dme. Then, navigate to maps, submaps, surface submaps, wilderness, and open wilderness_areas.dm.
|
||||
|
||||
Joint (This assumes we’ve located the file as per instructions above. If you’re not using Dream Maker or VSCode, you’re expected to understand how to open the file yourself.) This section will be done in VSCode, but later iterations will screenshot the process in Dream Maker (it’s basically identical, just waiting on the wiki page to bother doing so.)
|
||||
|
||||
Go ahead and look over the areas. We’ll notice something, even if you don’t quite know how to read code: each new area only has name + ambience changed, likely, right?
|
||||
|
||||
Image here [https://i.imgur.com/A2pMluj.png](https://i.imgur.com/A2pMluj.png)
|
||||
|
||||
Without getting too deep into code, BYOND uses OOP, which in layman’s terms, means every single new object created with the same path as another will inherit things. This saves us having to redefine it every time we make a new one.
|
||||
|
||||
For YOU this means all we’re going to do is highlight an area subsection (I’ll be using Black-Op Shuttle’s area for this) [https://i.imgur.com/zCUu0R3.png](https://i.imgur.com/zCUu0R3.png), hit copy, and then scroll down to the bottom, hit enter once to generate a new line, and hit paste. You should see this, if in VSCode: [https://i.imgur.com/AtQvNV6.png](https://i.imgur.com/AtQvNV6.png)
|
||||
|
||||
Now we’re going to change “Blackshuttledown” to “myfirstPOI”. Change it to whatever you like, but I’m simply using a tutorial name here. Then, at the “name = “POI - blahblah”, we’re going to change it to “POI - Newbie”. Leave everything else alone for now unless you want a special ambience, though you can easily just replace AMBIENCE_HIGHSEC with AMBIENCE_OTHERWORLDLY.
|
||||
|
||||
Once we’ve done that, our new area should look like this: [https://i.imgur.com/ttVNbYq.png](https://i.imgur.com/ttVNbYq.png)
|
||||
|
||||
With that, we save, and exit the code. We’ll come back to it at a later step to ADD our POI to the actual map template section, but for now, we need to MAKE the POI first, no?
|
||||
|
||||
For this next step, return to the BASE folder, where the .dme and maps/etc folders are.
|
||||
|
||||
\
|
||||
We’re going to navigate to *tools* and then StrongDMM. This is not REQUIRED, but is heavily recommended - maintainers will ask you to run mapmerge where possible if you use DreamMaker. The rest of this guide WILL ASSUME YOU ARE USING STRONGDMM. The wiki will offer sections for DreamMaker as well as StrongDMM. \
|
||||
\
|
||||
Run sdmmlauncher.exe. Screenshot here: \
|
||||
[https://i.imgur.com/VxvRntf.png](https://i.imgur.com/VxvRntf.png)
|
||||
|
||||
You should be greeted with this: [https://i.imgur.com/9dhRcz3.png](https://i.imgur.com/9dhRcz3.png)
|
||||
|
||||
We are going to do something first before opening any environments. Go to File, Preferences in the top left. Then, in Interface Options, select a style you like. Rykka (hi, the author of this) uses Dark Coast. Use whatever you like.
|
||||
|
||||
Under Save Options, **change this to TGM.** Check Sanitize Variables. Also check Clean Unused Keys, if this is not already checked. Nudge mode should be pixel_x/pixel_y.
|
||||
|
||||
With that done, hit Open Environment, and navigate to the folder we downloaded in the earlier step. Open vorestation.dme, for VORE + CHOMP, or Polaris.dme for Polaris.
|
||||
|
||||
The file will load, and then you’ll still be at a blank screen, but now the Environment Tree should have 4 directories under it. \
|
||||
This is what it looks like. [https://i.imgur.com/RtURzx8.png](https://i.imgur.com/RtURzx8.png)
|
||||
|
||||
You should also be able to see the name in the top left.
|
||||
|
||||
Now, we are going to go to File, New Map. \
|
||||
This will open a dialogue box with the base folder of our repo. Don’t panic. \
|
||||
Go to /maps/, and then find the folder the POIs for the given map are saved. This is code-base specific, so Polaris + CHOMP use /maps/submaps/surface_submaps/ for theirs, and then each folder (mountains, wilderness, plains) is a different area. If you’re on Southern Cross, Plains is the area around the outpost, Mountains is the mines, and Wilderness is the deep wilds. Polaris, TBD.
|
||||
|
||||
VORE has their submaps for SPECIFIC areas defined in /mapused (IE Tether)/submaps. This sub-main folder should only be used for map-specific POIs, for example, POIs that would only exist if Tether was loaded.
|
||||
|
||||
Otherwise, refer to /submaps/ and locate the folder in question. If you’re not sure, poke around, or ask in the channel for the codebase you’re currently working on for help.
|
||||
|
||||
Once we’ve located the folder, we’ll assume we’re doing Wilderness for this one - we’ll be in this folder, and we’ll type the name of our new map and hit Save. Image here: [https://i.imgur.com/CCIuuwy.png](https://i.imgur.com/CCIuuwy.png)
|
||||
|
||||
Now, it is going to bring up a dialogue box on map size. ALWAYS leave the Z at 1. \
|
||||
Set the X + Y to whatever you prefer, this will be the SIZE of our POI. For example, six tiles across would be 6 X, and 5 tiles tall would be 5 Y. The layout referenced in the tutorial is here: [https://i.imgur.com/T2jQwZB.png](https://i.imgur.com/T2jQwZB.png)
|
||||
|
||||
Hit Ok. \
|
||||
\
|
||||
Your new map will load in the bottom-left corner, depending on SDMM. Scroll in using your mouse, and hold the middle mouse button (or whatever the hotkey is if SDMM ever changes) to pan.
|
||||
|
||||
Once we’ve navigated and zoomed so our POI is relatively sized, we should see this: [https://i.imgur.com/e8VhPxk.png](https://i.imgur.com/e8VhPxk.png)
|
||||
|
||||
Hit Save (Ctrl + S) now! Just in case.
|
||||
|
||||
In the top left, where it says “Types Filter”, type the name of our new area. This will be “myfirstPOI”. Click to select. You should see this. [https://i.imgur.com/mG458sl.png](https://i.imgur.com/mG458sl.png)
|
||||
|
||||
Go to the map editor, and drag it over the interior tiles. Then, go back to types filter (where we typed in prior), clear it, and find template. We’ll see two things come up, /turf/template_noop, and /area/template_noop. Do turf template around the outside of our new area, and then do area template around the outside of our new area. \
|
||||
\
|
||||
We should see this: \
|
||||
[https://i.imgur.com/z722p97.png](https://i.imgur.com/z722p97.png)
|
||||
|
||||
Now go to Options, and hit “Toggle Area”. This will turn off the area display. Clear the types filter select, and hit the big - button next to it to collapse all trees again so we just have 4, these being (area/turf/obj/mob), our base BYOND types.
|
||||
|
||||
Go to turf, then simulated, then floor, then outdoors, then dirt. Drag it over the center tiles, so now there should only be dirt + passthrough. (the template turf is also called passthrough in coder parlance). Obviously, we can add more turfs and get more complex if you like, but you’ll need to worry about atmos composition and etc. We’re not going to stress about that for now, as we can learn about all that later.
|
||||
|
||||
For now, collapse all trees again, and then go to “mob”, then living, then simple_mob (do not use simple_animal, it is deprecated), then select a mob from any of these subtrees. For our example, we’re going to go to animal, wolf, direwolf, and choose a regular direwolf (or Rykka, if you’re on a VORE downstream).
|
||||
|
||||
Place it anywhere on the dirt or passthrough tiles, and hit save. I recommend NOT placing on the passthrough tiles, as they may suddenly spawn inside solid rock.
|
||||
|
||||
Make sure to save. We’ve accomplished adding a rudimentary, if not-super-featured POI.
|
||||
|
||||
This is what it should look like before we close the editor. [https://i.imgur.com/MU1YuKs.png](https://i.imgur.com/MU1YuKs.png)
|
||||
|
||||
Now, we’re going to go back to our editor of choice. Refer above for instructions on how to open the codebase on each editor, but we’re going to, instead of opening wilderness_areas, open wilderness.dm.
|
||||
|
||||
This will bring you to a bunch of new stuff. You’re going to see an #if and etc.
|
||||
|
||||
DON’T PANIC.
|
||||
|
||||
All we’re going to do is scroll down the list, and find where our POI would slot in alphabetically. For instance, ours, via this tutorial, is myfirstPOI.dmm. We’re going to insert this after musk.dmm.
|
||||
|
||||
Click at the end of #include “musk.dmm” and hit enter once, then type #include “myfirstPOI.dmm”. Name will vary, of course, depending on your POI, but for this tutorial, that’s the name we used.
|
||||
|
||||
You should see this if the step was completed successfully. [https://i.imgur.com/c686Ji4.png](https://i.imgur.com/c686Ji4.png)
|
||||
|
||||
Now, we’re going to scroll down. Remember earlier how it was explained that you only need to change the variables that DO change on your new map?
|
||||
|
||||
Copy line 76, or this area snippet: `/datum/map_template/surface/wilderness/deep/BSD`
|
||||
|
||||
At the end of the file, hit paste after inserting a new line underneath the last entry, so there’s always a line of space between the end of one thing and the next.
|
||||
|
||||
Then, as with adding the area, change the “BSD” to your name, then “name = “blah”” to whatever your name is.
|
||||
|
||||
Change the name of the .dmm in mappath to match your .dmm, and change the cost down to 5 (this is a very tiny POI). Remove the template_group, as we don’t use it presently.
|
||||
|
||||
It should look like this afterwards:
|
||||
|
||||
[https://i.imgur.com/HguoHxT.png](https://i.imgur.com/HguoHxT.png)
|
||||
|
||||
And we’ve added it! Woo!
|
||||
|
||||
Before you go “man that was way too much work fuck this” we still need to PR it. \
|
||||
Open your git client of choice - if you’ve been following the guide up to this point, we’ll reference Gitkraken.
|
||||
|
||||
As explained in the Guide to Opening your First PR, you’ll need to Stage + Commit these files. If you’ve followed instructions and still need help, contact maintainers or ask for help in the development channels.
|
||||
|
||||
Commit, and then again, as per prior, we are going to start a pull request. At this point, you should be done!
|
||||
|
||||
As with the other guides, if you run into issues, please let maintainers know and we’ll help you out. DON’T FEEL BAD FOR BEING NEW AND GOING “AAA”. \
|
||||
\
|
||||
We all started somewhere. I hope this guide helps give you the confidence you need to contribute to this codebase and help keep our project going. Thank you for your time and effort. <3
|
||||
@@ -0,0 +1,59 @@
|
||||
Overmap Ships + Places, the Guide
|
||||
This is a very basic list of just "what is needed". It is assumed you'll lookup where these go.
|
||||
Proper, full-length guide will be added later to here + the wiki.
|
||||
For now, just use this as reference for what is needed for Overmap ships + locations.
|
||||
|
||||
**CREATED IN-EDITOR:**
|
||||
```
|
||||
/obj/effect/shuttle_landmark
|
||||
var edits:
|
||||
base_area: what area to replace the shuttle's area with when it's left
|
||||
base_turf: what turf to replace the shuttle's location when it's left
|
||||
landmark_tag: lowercase identifier. Used in current_location
|
||||
name: the landmark's name.
|
||||
```
|
||||
|
||||
**CREATED IN-CODE:**
|
||||
```c
|
||||
/area/shuttle/SHIPNAME
|
||||
name = "\improper [Name]" // Just replace [Name] with whatever your want to name the ship
|
||||
icon_state = "shuttlered"
|
||||
requires_power = 1 // Or 0 if you don't want to have to power the ship yourself.
|
||||
//Area should probably be placed in southern-cross-areas.dm but the rest can go into some file all together.
|
||||
|
||||
/datum/shuttle/autodock/overmap/SHIPNAME
|
||||
name = "[Name]"
|
||||
warmup_time = 0
|
||||
current_location = "" // See CREATED IN-EDITOR
|
||||
shuttle_area = /area/shuttle/SHIPNAME // See above area. Can also be list of multiple areas.
|
||||
fuel_consumption = 1 // Typically defines how much fuel the shuttle uses per jump. 1-3 is reasonable, base it on size.
|
||||
move_direction = NORTH / SOUTH / EAST / WEST
|
||||
|
||||
/obj/effect/overmap/visitable/ship/landable/SHIPNAME
|
||||
name = "[Name]" // Can be named whatever, best to keep it similar to actual ship name.
|
||||
desc = "Some description goes here."
|
||||
vessel_mass = 1000 // Some factor for speed. For reference, 1000 is fucking fast, 10000 is only fast when maxed on engines and very costly.
|
||||
vessel_size = SHIP_SIZE_TINY / SHIP_SIZE_SMALL / SHIP_SIZE_LARGE
|
||||
shuttle = "[Name]" // Direct reference to above shuttle. MUST be the same as name.
|
||||
|
||||
/obj/machinery/computer/shuttle_control/explore/SHIPNAME
|
||||
name = "short jump console"
|
||||
shuttle_tag = "[Name]" // Direct reference to above shuttle. MUST be the same as name.
|
||||
req_one_access = list(access_pilot)
|
||||
```
|
||||
|
||||
**OVERMAP SHIP CREATION INSTRUCTIONS:**
|
||||
Build your shuttle however you'd like, though it MUST have:
|
||||
- Phoron cannister(s) hooked up to proper engines. /obj/machinery/atmospherics/unary/engine
|
||||
- Engine Control. `/obj/machinery/computer/ship/engines`
|
||||
- Helm Control. `/obj/machinery/computer/ship/helm`
|
||||
- Fuel port, for short distance jumps and docking. `/obj/structure/fuel_port`
|
||||
- Short jump console, defined in code earlier. `/obj/machinery/computer/shuttle_control/explore/SHIPNAME`
|
||||
- A spawned in effect, defined in code earlier, inside of the ship area. `/obj/effect/overmap/visitable/ship/landable/SHIPNAME`
|
||||
- A docking point, made through the map editor, mentioned earlier. `/obj/effect/ship_landmark`. Typically this is placed inside the ship, directly in front of the exterior door. This dictates where it places the shuttles so be sure to actually test how your shuttles react to landing in odd locations. The landmark's tag also needs to be added to the appropriate area in `maps/southern_cross/overmap/sectors.dm` or else ships cannot dock there.
|
||||
- The shuttle also needs to be placed entirely in the designated area that you made in the above code, since shuttles are based off of the area everything is in.
|
||||
|
||||
It would be **RECOMMENDED** to also have:
|
||||
- Sensors, controlled by `/obj/machinery/computer/ship/sensors` and `/obj/machinery/shipsensors` (maybe the /weak variant for small ships if you add them at all?)
|
||||
- Docking Controller. Not 100% sure on how these work yet, but will be updated as needed. Not necessary, just nice to have for ease of access.
|
||||
- A pump somewhere in the fuel intake to your engines, for better fuel management.
|
||||
@@ -0,0 +1,30 @@
|
||||
This guide will simply list VSCode + the extensions needed, plus very basic instructions, as VSCode has a NUMBER of tutorials on it, and there's little need to reinvent the wheel.
|
||||
It is assumed that you can follow the VSCode walkthrough. Navigate to the Extensions tab on the left, type @recommended, and then install each extension under the "Recommended" Tab.
|
||||
Screenshot here, but don't rely on this as the workspace recommendations may change over time. https://i.imgur.com/CF0P6TI.png
|
||||
If you require assistance, don't feel stupid! Just ask a maintainer or ask in Discord for help. Be prepared to take screenshots if you need.
|
||||
|
||||
**VSCode + All mission-critical extensions for DM Coding.**
|
||||
<https://code.visualstudio.com/> VSCode, the root tool.
|
||||
<https://marketplace.visualstudio.com/items?itemName=gbasood.byond-dm-language-support> DM language support, allow autoupdates
|
||||
<https://marketplace.visualstudio.com/items?itemName=platymuus.dm-langclient> DM Language client, also allows compiling. When setting it up you need to go to extension settings, then "choose folder", pick the BYOND folder that has "uninstall.exe" and "bin" folders (the root/base folder). Then, once that's done, you can literally hit ctrl+shift+b and choose the .dme, and compile inside VSCode. It's FAR faster than compiling in Dream Maker.
|
||||
Screenshot of settings: <https://i.gyazo.com/378b93de1a68886a0dc3b919a2a7a401.png>
|
||||
<https://marketplace.visualstudio.com/items?itemName=stylemistake.auto-comment-blocks> Auto Comment Blocks (Allows multi-line comments easily in DM)
|
||||
<https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow> Indent Rainbow - makes your indents colorcoded by how deep they are.
|
||||
<https://marketplace.visualstudio.com/items?itemName=Donkie.vscode-tgstation-test-adapter> Not adapted for our code yet, but this allows one to run compile tests the same as online does.
|
||||
|
||||
{
|
||||
"editor.bracketPairColorization.enabled": true,
|
||||
"editor.guides.bracketPairs":"active"
|
||||
}
|
||||
|
||||
Add this to settings.json
|
||||
If you run into issues, ask in Discord for help.
|
||||
|
||||
**Optional.**
|
||||
<https://marketplace.visualstudio.com/items?itemName=icrawl.discord-vscode> Discord rich presence, not needed, but looks pretty
|
||||
<https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens> This one is also optional, works for allowing you to gitblame and stuff. Requires setup, but will walk you through it, and ALSO links with Gitkraken. Extremely handy.
|
||||
|
||||
**Quick Tips for VSCode**
|
||||
Highlighting a proc and right clicking, then going to "Definition" or "Implementation" will allow you to easily see/lookup wherever it's used. This is massively helpful over having to manually search it.
|
||||
CTRL+F will bring up a search, that also allows a replace line-by-line.
|
||||
CTRL+Clicking will also (usually) take you to the definition of a proc/verb/etc.
|
||||
|
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 211 KiB |
|
Before Width: | Height: | Size: 624 KiB After Width: | Height: | Size: 624 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 150 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 3.1 KiB |