/obj/item/mecha_parts/mecha_equipment/weapon name = "mecha weapon" range = MECHA_RANGED destroy_sound = 'sound/mecha/weapdestr.ogg' var/projectile var/fire_sound var/projectiles_per_shot = 1 var/variance = 0 var/randomspread = FALSE //use random spread for machineguns, instead of shotgun scatter var/projectile_delay = 0 var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. var/kickback = TRUE //Will using this weapon in no grav push mecha back. mech_flags = EXOSUIT_MODULE_COMBAT /obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/vehicle/sealed/mecha/M) if(!..()) return FALSE if(istype(M, /obj/vehicle/sealed/mecha/combat)) return TRUE if((locate(/obj/item/mecha_parts/concealed_weapon_bay) in M.contents) && !(locate(/obj/item/mecha_parts/mecha_equipment/weapon) in M.equipment)) return TRUE return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/action(mob/source, atom/target, list/modifiers) if(!action_checks(target)) return FALSE var/newtonian_target = turn(chassis.dir,180) . = ..()//start the cooldown early because of sleeps for(var/i in 1 to projectiles_per_shot) if(energy_drain && !chassis.has_charge(energy_drain))//in case we run out of energy mid-burst, such as emp break var/spread = 0 if(variance) if(randomspread) spread = round((rand() - 0.5) * variance) else spread = round((i / projectiles_per_shot - 0.5) * variance) var/obj/item/projectile/projectile_obj = new projectile(get_turf(src)) projectile_obj.log_override = TRUE //we log being fired ourselves a little further down. projectile_obj.firer = chassis projectile_obj.preparePixelProjectile(target, source, modifiers, spread) projectile_obj.fire() if(!projectile_obj.suppressed && firing_effect_type) new firing_effect_type(get_turf(src), chassis.dir) playsound(chassis, fire_sound, 50, TRUE) log_combat(source, target, "fired [projectile_obj] at", src, "from [chassis] at [get_area_name(src, TRUE)]") sleep(max(0, projectile_delay)) if(kickback) chassis.newtonian_move(newtonian_target) chassis.log_message("[key_name(source)] fired [src], targeting [target].", LOG_ATTACK) //Base energy weapon type /obj/item/mecha_parts/mecha_equipment/weapon/energy name = "general energy weapon" firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser equip_cooldown = 8 name = "\improper CH-PS \"Immolator\" laser" desc = "A weapon for combat exosuits. Shoots basic lasers." icon_state = "mecha_laser" energy_drain = 30 projectile = /obj/item/projectile/beam/laser fire_sound = 'sound/weapons/laser.ogg' harmful = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler equip_cooldown = 8 name = "\improper CH-DS \"Peacemaker\" disabler" desc = "A weapon for combat exosuits. Shoots basic disablers." icon_state = "mecha_disabler" energy_drain = 30 projectile = /obj/item/projectile/beam/disabler fire_sound = 'sound/weapons/taser2.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy equip_cooldown = 15 name = "\improper CH-LC \"Solaris\" laser cannon" desc = "A weapon for combat exosuits. Shoots heavy lasers." icon_state = "mecha_laser" energy_drain = 60 projectile = /obj/item/projectile/beam/laser/heavylaser fire_sound = 'sound/weapons/lasercannonfire.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion equip_cooldown = 20 name = "\improper MKIV ion heavy cannon" desc = "A weapon for combat exosuits. Shoots technology-disabling ion beams. Don't catch yourself in the blast!" icon_state = "mecha_ion" energy_drain = 120 projectile = /obj/item/projectile/ion fire_sound = 'sound/weapons/laser.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla equip_cooldown = 35 name = "\improper MKI Tesla Cannon" desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine." icon_state = "mecha_ion" energy_drain = 500 projectile = /obj/item/projectile/energy/tesla/cannon fire_sound = 'sound/magic/lightningbolt.ogg' harmful = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse equip_cooldown = 30 name = "eZ-13 MK2 heavy pulse rifle" desc = "A weapon for combat exosuits. Shoots powerful destructive blasts capable of demolishing obstacles." icon_state = "mecha_pulse" energy_drain = 120 projectile = /obj/item/projectile/beam/pulse/heavy fire_sound = 'sound/weapons/marauder.ogg' harmful = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma equip_cooldown = 10 name = "217-D Heavy Plasma Cutter" desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." icon_state = "mecha_plasmacutter" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' energy_drain = 30 projectile = /obj/item/projectile/plasma/adv/mech fire_sound = 'sound/weapons/plasma_cutter.ogg' harmful = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/vehicle/sealed/mecha/M) if(..()) //combat mech return TRUE else if(LAZYLEN(M.equipment) < M.max_equip) return TRUE return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser name = "\improper PBT \"Pacifier\" mounted taser" desc = "A weapon for combat exosuits. Shoots non-lethal stunning electrodes." icon_state = "mecha_taser" energy_drain = 20 equip_cooldown = 8 projectile = /obj/item/projectile/energy/electrode fire_sound = 'sound/weapons/taser.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/honker name = "\improper HoNkER BlAsT 5000" desc = "Equipment for clown exosuits. Spreads fun and joy to everyone around. Honk!" icon_state = "mecha_honker" energy_drain = 200 equip_cooldown = 150 range = MECHA_MELEE|MECHA_RANGED kickback = FALSE mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/vehicle/sealed/mecha/mecha) . = ..() if(!.) return if(!istype(mecha, /obj/vehicle/sealed/mecha/combat/honker)) return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/honker/action(mob/source, atom/target, params) if(!action_checks(target)) return playsound(chassis, 'sound/items/airhorn.ogg', 100, TRUE) to_chat(source, "[icon2html(src, source)]HONK") for(var/mob/living/carbon/M in ohearers(6, chassis)) if(!M.can_hear()) continue var/turf/turf_check = get_turf(M) if(isspaceturf(turf_check) && !turf_check.Adjacent(src)) //in space nobody can hear you honk. continue to_chat(M, "HONK") M.SetSleeping(0) M.stuttering += 20 var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(0, 30) M.Paralyze(60) if(prob(30)) M.Stun(200) M.Unconscious(80) else M.Jitter(500) log_message("Honked from [src.name]. HONK!", LOG_MECHA) var/turf/T = get_turf(src) message_admins("[ADMIN_LOOKUPFLW(source)] used a Mecha Honker in [ADMIN_VERBOSEJMP(T)]") log_game("[key_name(source)] used a Mecha Honker in [AREACOORD(T)]") return ..() //Base ballistic weapon type /obj/item/mecha_parts/mecha_equipment/weapon/ballistic name = "general ballistic weapon" fire_sound = 'sound/weapons/shot.ogg' var/projectiles var/projectiles_cache //ammo to be loaded in, if possible. var/projectiles_cache_max var/projectile_energy_cost var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand var/ammo_type /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(target) if(!..()) return FALSE if(projectiles <= 0) return FALSE return TRUE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info() return "[..()] \[[src.projectiles][projectiles_cache_max &&!projectile_energy_cost?"/[projectiles_cache]":""]\][!disabledreload &&(src.projectiles < initial(src.projectiles))?" - Rearm":null]" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/rearm() if(projectiles < initial(projectiles)) var/projectiles_to_add = initial(projectiles) - projectiles if(projectile_energy_cost) while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add) projectiles++ projectiles_to_add-- chassis.use_power(projectile_energy_cost) else if(!projectiles_cache) return FALSE if(projectiles_to_add <= projectiles_cache) projectiles = projectiles + projectiles_to_add projectiles_cache = projectiles_cache - projectiles_to_add else projectiles = projectiles + projectiles_cache projectiles_cache = 0 send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) log_message("Rearmed [src.name].", LOG_MECHA) return TRUE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/needs_rearm() . = !(projectiles > 0) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list) ..() if (href_list["rearm"]) src.rearm() return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(mob/source, atom/target, params) if(..()) projectiles -= projectiles_per_shot send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) return ..() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine name = "\improper FNX-99 \"Hades\" Carbine" desc = "A weapon for combat exosuits. Shoots incendiary bullets." icon_state = "mecha_carbine" equip_cooldown = 10 projectile = /obj/item/projectile/bullet/incendiary/fnx99 projectiles = 24 projectiles_cache = 24 projectiles_cache_max = 96 harmful = TRUE ammo_type = "incendiary" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced name = "\improper S.H.H. \"Quietus\" Carbine" desc = "A weapon for combat exosuits. A mime invention, field tests have shown that targets cannot even scream before going down." fire_sound = 'sound/weapons/Gunshot_silenced.ogg' icon_state = "mecha_mime" equip_cooldown = 30 projectile = /obj/item/projectile/bullet/mime projectiles = 6 projectile_energy_cost = 50 harmful = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot name = "\improper LBX AC 10 \"Scattershot\"" desc = "A weapon for combat exosuits. Shoots a spread of pellets." icon_state = "mecha_scatter" equip_cooldown = 20 projectile = /obj/item/projectile/bullet/scattershot projectiles = 40 projectiles_cache = 40 projectiles_cache_max = 160 projectiles_per_shot = 4 variance = 25 harmful = TRUE ammo_type = "scattershot" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter name = "\improper Melon Seed \"Scattershot\"" desc = "A weapon for combat exosuits. Shoots a spread of pellets, shaped as seed." fire_sound = 'sound/weapons/gunshotshotgunshot.ogg' icon_state = "mecha_scatter" equip_cooldown = 20 projectile = /obj/item/projectile/bullet/seed projectiles = 20 projectiles_cache = 20 projectiles_cache_max = 160 projectiles_per_shot = 10 variance = 25 harmful = TRUE ammo_type = "scattershot" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg name = "\improper Ultra AC 2" desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst." icon_state = "mecha_uac2" equip_cooldown = 10 projectile = /obj/item/projectile/bullet/lmg projectiles = 300 projectiles_cache = 300 projectiles_cache_max = 1200 projectiles_per_shot = 3 variance = 6 randomspread = 1 projectile_delay = 2 harmful = TRUE ammo_type = "lmg" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack name = "\improper SRM-8 missile rack" desc = "A weapon for combat exosuits. Launches light explosive missiles." icon_state = "mecha_missilerack" projectile = /obj/item/projectile/bullet/a84mm_he fire_sound = 'sound/weapons/rocketlaunch.ogg' projectiles = 8 projectiles_cache = 0 projectiles_cache_max = 0 disabledreload = TRUE equip_cooldown = 60 harmful = TRUE ammo_type = "missiles_he" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops projectiles = 420 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching name = "\improper BRM-6 missile rack" desc = "A weapon for combat exosuits. Launches high-explosive breaching missiles with a safety fuze designed to explode only when striking a sturdy target." icon_state = "mecha_missilerack_six" projectile = /obj/item/projectile/bullet/a84mm_br fire_sound = 'sound/weapons/rocketlaunch.ogg' projectiles = 6 projectiles_cache = 0 projectiles_cache_max = 0 disabledreload = TRUE equip_cooldown = 60 harmful = TRUE ammo_type = "missiles_br" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher var/missile_speed = 2 var/missile_range = 30 var/diags_first = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/action(mob/source, atom/target, params) if(!action_checks(target)) return var/obj/O = new projectile(chassis.loc) playsound(chassis, fire_sound, 50, TRUE) log_message("Launched a [O.name] from [name], targeting [target].", LOG_MECHA) projectiles-- proj_init(O, source) O.throw_at(target, missile_range, missile_speed, source, FALSE, diagonals_first = diags_first) return TRUE //used for projectile initilisation (priming flashbang) and additional logging /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/proc/proj_init(obj/O, mob/user) return /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang name = "\improper SGL-6 grenade launcher" desc = "A weapon for combat exosuits. Launches primed flashbangs." icon_state = "mecha_grenadelnchr" projectile = /obj/item/grenade/flashbang fire_sound = 'sound/weapons/grenadelaunch.ogg' projectiles = 6 projectiles_cache = 6 projectiles_cache_max = 24 missile_speed = 1.5 equip_cooldown = 60 var/det_time = 20 ammo_type = "flashbang" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(obj/item/grenade/flashbang/F, mob/user) var/turf/T = get_turf(src) message_admins("[ADMIN_LOOKUPFLW(user)] fired a [F] in [ADMIN_VERBOSEJMP(T)]") log_game("[key_name(user)] fired a [F] in [AREACOORD(T)]") addtimer(CALLBACK(F, TYPE_PROC_REF(/obj/item/grenade/flashbang, prime)), det_time) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze name = "\improper SOB-3 grenade launcher" desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster." projectiles = 3 projectiles_cache = 0 projectiles_cache_max = 0 disabledreload = TRUE projectile = /obj/item/grenade/clusterbuster equip_cooldown = 90 ammo_type = "clusterbang" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar name = "banana mortar" desc = "Equipment for clown exosuits. Launches banana peels." icon_state = "mecha_bananamrtr" projectile = /obj/item/grown/bananapeel fire_sound = 'sound/items/bikehorn.ogg' projectiles = 15 missile_speed = 1.5 projectile_energy_cost = 100 equip_cooldown = 20 mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return TRUE return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar name = "mousetrap mortar" desc = "Equipment for clown exosuits. Launches armed mousetraps." icon_state = "mecha_mousetrapmrtr" projectile = /obj/item/assembly/mousetrap/armed fire_sound = 'sound/items/bikehorn.ogg' projectiles = 15 missile_speed = 1.5 projectile_energy_cost = 100 equip_cooldown = 10 mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return TRUE return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(obj/item/assembly/mousetrap/armed/M) M.secured = 1 //Classic extending punching glove, but weaponised! /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove name = "\improper Oingo Boingo Punch-face" desc = "Equipment for clown exosuits. Delivers fun right to your face!" icon_state = "mecha_punching_glove" energy_drain = 250 equip_cooldown = 20 range = MECHA_MELEE|MECHA_RANGED missile_range = 5 projectile = /obj/item/punching_glove fire_sound = 'sound/items/bikehorn.ogg' projectiles = 10 projectile_energy_cost = 500 harmful = TRUE diags_first = TRUE /// Damage done by the glove on contact. Also used to determine throw distance (damage / 5) var/punch_damage = 35 /// TRUE - Can toggle between lethal and non-lethal || FALSE - Cannot toggle var/can_toggle_lethal = TRUE mech_flags = EXOSUIT_MODULE_HONK /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/can_attach(obj/vehicle/sealed/mecha/combat/honker/M) if(..()) if(istype(M)) return TRUE return FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/get_equip_info() if(!chassis) return if(can_toggle_lethal) return "[..()]   [harmful?"Punch":"Pat"] mode" else return ..() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/Topic(href, href_list) ..() if(href_list["lethalPunch"]) harmful = !harmful if(harmful) to_chat(usr, "[icon2html(src, usr)]Lethal Fisting Enabled.") else to_chat(usr, "[icon2html(src, usr)]Lethal Fisting Disabled.") /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/action(mob/source, atom/target, params) . = ..() if(.) to_chat(usr, "[icon2html(src, usr)]HONK") /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/proj_init(obj/item/punching_glove/PG) if(!istype(PG)) return if(harmful) PG.throwforce = punch_damage else PG.throwforce = 0 //has to be low sleep or it looks weird, the beam doesn't exist for very long so it's a non-issue chassis.Beam(PG, icon_state = "chain", time = missile_range * 20, maxdistance = missile_range + 2, beam_sleep_time = 1) /obj/item/punching_glove name = "punching glove" desc = "INCOMING HONKS" throwforce = 35 icon_state = "punching_glove" /obj/item/punching_glove/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) if(ismovable(hit_atom)) var/atom/movable/AM = hit_atom AM.safe_throw_at(get_edge_target_turf(AM,get_dir(src, AM)), clamp(round(throwforce/5), 2, 20), 2) //Throws them equal to damage/5, with a min range of 2 and max range of 20 qdel(src)