Merge branch 'stock_market' of https://github.com/GhostActual/VOREStation into stock_market

This commit is contained in:
ItsSelis
2022-04-18 19:57:54 +02:00
126 changed files with 3603 additions and 1143 deletions
+11 -3
View File
@@ -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"
]
}
+2 -1
View File
@@ -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
+121
View File
@@ -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>"
+10 -8
View File
@@ -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.
+17 -7
View File
@@ -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))
+10
View File
@@ -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
+2 -2
View File
@@ -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)
+4 -3
View File
@@ -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>")
+38 -81
View File
@@ -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)
+8 -4
View File
@@ -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
+59 -4
View File
@@ -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))
+5 -1
View File
@@ -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)
+3 -4
View File
@@ -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
+6
View File
@@ -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"
+2 -1
View File
@@ -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"
+3 -3
View File
@@ -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"
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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,
+1 -1
View File
@@ -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
)
+29
View File
@@ -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
+7 -7
View File
@@ -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()
..()
+8 -5
View File
@@ -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)
+1 -1
View File
@@ -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
+4
View File
@@ -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"
-3
View File
@@ -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)
+2 -2
View File
@@ -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>")
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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
+11 -12
View File
@@ -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()
+127 -63
View File
@@ -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 todays 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 todays 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-Takahashis 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-Takahashis 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.
+42 -13
View File
@@ -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 todays 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 todays 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 arent 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
+2 -22
View File
@@ -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
+1 -1
View File
@@ -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)
..()
+255
View File
@@ -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.")
+20 -1
View File
@@ -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
+5 -104
View File
@@ -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)
-107
View File
@@ -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
+12
View File
@@ -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"
+1 -1
View File
@@ -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]
+1 -1
View File
@@ -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
+12
View File
@@ -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>"
+5
View File
@@ -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)
+17
View File
@@ -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
+16 -1
View File
@@ -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")
+159
View File
@@ -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 ..()
+41 -42
View File
@@ -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
+155
View File
@@ -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 codebases 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. Well assume its named “shep-dev-POI” for this tutorials context.
With that out of the way, congrats on getting setup! Lets dive into how to make your first POI. \
\
To start, we need to open up the repo you downloaded earlier. If youre 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 youre 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 youre not sure, poke around, or ask in the channel for the codebase youre currently working on for help.
Once weve 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 youre using.
VSCode: If youve already installed VSCode and told it to associate with .dm files as per the tutorial, itll 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. Well 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 weve located the file as per instructions above. If youre not using Dream Maker or VSCode, youre 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 (its basically identical, just waiting on the wiki page to bother doing so.)
Go ahead and look over the areas. Well notice something, even if you dont 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 laymans 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 were going to do is highlight an area subsection (Ill be using Black-Op Shuttles 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 were going to change “Blackshuttledown” to “myfirstPOI”. Change it to whatever you like, but Im simply using a tutorial name here. Then, at the “name = “POI - blahblah”, were 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 weve 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. Well 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.
\
Were 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 youll 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. Dont 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 youre 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 youre not sure, poke around, or ask in the channel for the codebase youre currently working on for help.
Once weve located the folder, well assume were doing Wilderness for this one - well be in this folder, and well 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 weve 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. Well 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 youll need to worry about atmos composition and etc. Were 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, were going to go to animal, wolf, direwolf, and choose a regular direwolf (or Rykka, if youre 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. Weve 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, were going to go back to our editor of choice. Refer above for instructions on how to open the codebase on each editor, but were going to, instead of opening wilderness_areas, open wilderness.dm.
This will bring you to a bunch of new stuff. Youre going to see an #if and etc.
DONT PANIC.
All were 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. Were 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, thats 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, were 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 theres 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 dont use it presently.
It should look like this afterwards:
[https://i.imgur.com/HguoHxT.png](https://i.imgur.com/HguoHxT.png)
And weve 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 youve been following the guide up to this point, well reference Gitkraken.
As explained in the Guide to Opening your First PR, youll need to Stage + Commit these files. If youve 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 well help you out. DONT 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.
+30
View File
@@ -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.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 624 KiB

After

Width:  |  Height:  |  Size: 624 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

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