Files
2016-03-06 20:52:14 +01:00

176 lines
6.7 KiB
Plaintext

// MASTER DATUMS
/datum/artifact/
var/associated_object = null
var/rarity_class = 0
var/datum/artifact_origin/artitype = null
var/list/validtypes = list("ancient","martian","wizard","eldritch","precursor")
// During setup, artitype will be set from a pick() from within the validtypes list.
// Keep it to only the five here or shit will probably get a bit weird. This allows us to exclude things that don't make
// any sense such as martian robot builders or ancient robot plant seeds.
var/internal_name = null
var/image/fx_image = null
//var/image/effects_overlay = null
var/obj/holder = null
// These are automatically handled. They're used to make the artifact glow different colors.
var/activated = 0 // Is the artifact currently switched on?
var/automatic_activation = 0 // Does the artifact switch itself on on spawn?
var/activ_sound = null // What noise the artifact makes when it activates
var/activ_text = null // What message the artifact transmits when it activates
var/deact_sound = null // Guess.
var/deact_text = null // No really, have a wild guess.
var/scramblechance = 10 // how likely this artifact is to look like a type it isnt
var/list/faults = list() // Automatically handled
var/list/fault_types = list() // this is set up based on the artifact's origin type
var/list/triggers = list()
var/validtriggers = list(/datum/artifact_trigger/force,/datum/artifact_trigger/electric,/datum/artifact_trigger/heat,
/datum/artifact_trigger/radiation,/datum/artifact_trigger/carbon_touch,/datum/artifact_trigger/silicon_touch)
var/min_triggers = 1
var/max_triggers = 1
var/hint_text = "emits a faint noise."
var/examine_hint = null
// These are used for module research
var/list/module_research = list()
var/module_research_insight = 1 // insight level into the origin of the artifact
var/health = 100
// This is mostly used in the stimulus procs that deal with damaging the artifact and whatnot.
// Once it hits 0 or below, the artifact is destroyed.
// these below are holders for data that will come back from the various artifact sensor test apparatus
var/list/react_mpct = list(0,0)
// Impact Pad - returns Vibration Amplitude, Vibration Frequency
// react_mpct should be set up in the ArtifactSetup proc
var/list/react_elec = list(0.1,0,0)
// Electrobox - returns Returned Current, Circuit Capacity, Circuit Interference
// react_elec should be set up in the item's New proc (NOT the datum's!)
var/list/react_heat = list(1,"NONE")
// Heat Plate - returns Artifact Temp, Heat Response, Cold Response, Details
// react_heat - set up first var in ArtifactSetup, the rest in the individual datums
var/list/react_xray = list(10,100,100,11,"NONE")
// X-ray - returns Density, Structural Consistency, Structural Integrity, Response, Special Features
// react_xray should be set as a variable on the artifact datum
var/list/touch_descriptors = list()
proc/post_setup()
return
proc/may_activate(var/obj/O)
if (!O)
return 0
return 1
// Added log entry calls here. See artifactprocs.dm for the proc (Convair880).
proc/effect_activate(var/obj/O)
if (!O)
return 1
O.add_fingerprint(usr)
ArtifactLogs(usr, null, O, "activated", null, istype(src, /datum/artifact/bomb/) ? 1 : 0)
return 0
proc/effect_deactivate(var/obj/O)
if (!O)
return 1
O.add_fingerprint(usr)
ArtifactLogs(usr, null, O, "deactivated", null, 0)
return 0
proc/effect_process(var/obj/O)
if (!O)
return 1
return 0
proc/effect_touch(var/obj/O,var/mob/living/user)
if (!O || !user)
return 1
O.add_fingerprint(user)
return 0
proc/effect_melee_attack(var/obj/O,var/mob/living/user,var/mob/living/target)
if (!O || !user || !target)
return 1
O.add_fingerprint(user)
ArtifactLogs(user, target, O, "weapon", null, 0)
return 0
proc/effect_click_tile(var/obj/O,var/mob/living/user,var/turf/T)
if (!O || !user || !T)
return 1
O.add_fingerprint(user)
if (!istype(O, /obj/item/artifact/attack_wand)) // Special log handling required there.
ArtifactLogs(user, T, O, "used", "triggering its effect on target turf", 0)
return 0
proc/get_trigger_by_string(var/string)
if (!istext(string))
return null
for (var/datum/artifact_trigger/AT in src.triggers)
if (AT.stimulus_required == string)
return AT
return null
proc/get_trigger_by_path(var/path)
if (!ispath(path))
return null
for (var/datum/artifact_trigger/AT in src.triggers)
if (AT.type == path)
return AT
return null
// SPECIFIC DATUMS
/datum/artifact/art
validtypes = list("ancient","martian","wizard","eldritch","precursor")
activated = 0
min_triggers = 0
max_triggers = 0
react_xray = list(10,100,100,11,"NONE")
// DATUMS USED BY ARTIFACTS
/datum/projectile/artifact
name = "energy bolt"
icon = 'icons/obj/projectiles.dmi'
icon_state = "u_laser"
power = 75
cost = 25
dissipation_rate = 0
dissipation_delay = 50
ks_ratio = 1.0
sname = "energy bolt"
shot_sound = 'sound/weapons/Taser.ogg'
shot_number = 1
damage_type = D_PIERCING
hit_ground_chance = 90
window_pass = 0
on_hit(atom/hit)
return
proc/randomise()
icon_state = pick("spark","laser","ibeam","u_laser","phaser_heavy","phaser_light","phaser_med","phaser_ultra","blue_spark","disrupt","disrupt_lethal","radbolt","crescent",
"goo","40mmgatling","elecorb","purple_orb","triple")
src.shot_sound = pick('sound/weapons/Taser.ogg','sound/weapons/flaregun.ogg','sound/weapons/Laser.ogg','sound/weapons/laserheavy.ogg','sound/weapons/laserlight.ogg','sound/weapons/lasermed.ogg','sound/weapons/laserultra.ogg','sound/weapons/grenade.ogg','sound/weapons/rocket.ogg','sound/weapons/snipershot.ogg','sound/weapons/TaserOLD.ogg','sound/weapons/ACgun1.ogg','sound/weapons/ACgun2.ogg')
var/namep1 = pick("neutrino","meson","photon","quark","disruptor","atomic","zero point","tachyon","plasma","quantum","neutron","baryon","hadron","electron","positron")
var/namep2 = pick("bolt","ray","beam","wave","burst","blast","torpedo","missile","bomb","shard","stream","string")
src.name = "[namep1] [namep2]"
// Now randomise the damage type, power, energy cost and other fun stuff
src.damage_type = pick(D_KINETIC,D_PIERCING,D_SLASHING,D_ENERGY,D_BURNING,D_RADIOACTIVE,D_TOXIC)
src.power = rand(2,50)
src.dissipation_rate = rand(1,power)
src.dissipation_delay = rand(1,10)
src.ks_ratio = pick(0, 1, prob(10); (rand(0, 10000) / 10000))
src.cost = rand(50,150)
if (prob(20))
src.window_pass = 1
// Rare chance of the gun firing several shots in a burst
shot_number = pick(1, prob(25); 2, prob(5); 3, prob(1); 4)