diff --git a/code/modules/projectiles/ammunition/magnetic.dm b/code/modules/projectiles/ammunition/magnetic.dm index 787ca15302..fc748b05df 100644 --- a/code/modules/projectiles/ammunition/magnetic.dm +++ b/code/modules/projectiles/ammunition/magnetic.dm @@ -2,7 +2,7 @@ name = "flechette magazine" desc = "A magazine containing steel flechettes." icon = 'icons/obj/ammo.dmi' - icon_state = "5.56" + icon_state = "caseless-mag" w_class = ITEMSIZE_SMALL matter = list(DEFAULT_WALL_MATERIAL = 1800) origin_tech = list(TECH_COMBAT = 1) @@ -11,4 +11,9 @@ /obj/item/weapon/magnetic_ammo/examine(mob/user) . = ..() - . += "There [(remaining == 1)? "is" : "are"] [remaining] flechette\s left!" \ No newline at end of file + . += "There [(remaining == 1)? "is" : "are"] [remaining] flechette\s left!" + +/obj/item/weapon/magnetic_ammo/pistol + name = "flechette magazine (small)" + desc = "A magazine containing smaller steel flechettes, intended for a pistol." + icon_state = "caseless-mag-short" diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index ae12ce034c..bbdcc29936 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -1,3 +1,10 @@ +#define ICON_CELL 1 +#define ICON_CAP 2 +#define ICON_BAD 4 +#define ICON_CHARGE 8 +#define ICON_READY 16 +#define ICON_LOADED 32 + /obj/item/weapon/gun/magnetic name = "improvised coilgun" desc = "A coilgun hastily thrown together out of a basic frame and advanced power storage components. Is it safe for it to be duct-taped together like that?" @@ -9,8 +16,8 @@ w_class = ITEMSIZE_LARGE var/obj/item/weapon/cell/cell // Currently installed powercell. - var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. - var/obj/item/weapon/stock_parts/manipulator/manipulator // Installed manipulator. Mostly for Phoron Bore, higher rating == less mats consumed upon firing + var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. Set to a path to spawn with one of that type. + var/obj/item/weapon/stock_parts/manipulator/manipulator // Installed manipulator. Mostly for Phoron Bore, higher rating == less mats consumed upon firing. Set to a path to spawn with one of that type. var/removable_components = TRUE // Whether or not the gun can be dismantled. var/gun_unreliable = 15 // Percentage chance of detonating in your hands. @@ -21,18 +28,34 @@ var/power_cost = 950 // Cost per fire, should consume almost an entire basic cell. var/power_per_tick // Capacitor charge per process(). Updated based on capacitor rating. -/obj/item/weapon/gun/magnetic/New() + var/state = 0 + +/obj/item/weapon/gun/magnetic/Initialize() + . = ..() + // So you can have some spawn with components + if(ispath(cell)) + cell = new cell(src) + if(ispath(capacitor)) + capacitor = new capacitor(src) + capacitor.charge = capacitor.max_charge + if(ispath(manipulator)) + manipulator = new manipulator(src) + if(ispath(loaded)) + loaded = new loaded(src) + START_PROCESSING(SSobj, src) + if(capacitor) power_per_tick = (power_cost*0.15) * capacitor.rating + update_icon() - . = ..() /obj/item/weapon/gun/magnetic/Destroy() STOP_PROCESSING(SSobj, src) QDEL_NULL(cell) QDEL_NULL(loaded) QDEL_NULL(capacitor) + QDEL_NULL(manipulator) . = ..() /obj/item/weapon/gun/magnetic/get_cell() @@ -45,25 +68,56 @@ capacitor.charge(power_per_tick) else capacitor.use(capacitor.charge * 0.05) - update_icon() + + update_state() // May update icon, only if things changed. -/obj/item/weapon/gun/magnetic/update_icon() - var/list/overlays_to_add = list() +/obj/item/weapon/gun/magnetic/proc/update_state() + var/newstate = 0 + + // Parts or lack thereof if(removable_components) if(cell) - overlays_to_add += image(icon, "[icon_state]_cell") + newstate |= ICON_CELL if(capacitor) - overlays_to_add += image(icon, "[icon_state]_capacitor") + newstate |= ICON_CAP + + // Functional state if(!cell || !capacitor) - overlays_to_add += image(icon, "[icon_state]_red") + newstate |= ICON_BAD else if(capacitor.charge < power_cost) - overlays_to_add += image(icon, "[icon_state]_amber") + newstate |= ICON_CHARGE else - overlays_to_add += image(icon, "[icon_state]_green") + newstate |= ICON_READY + + // Ammo indicator if(loaded) - overlays_to_add += image(icon, "[icon_state]_loaded") + newstate |= ICON_LOADED + + // Only update if the state has changed + var/needs_update = FALSE + if(state != newstate) + needs_update = TRUE + + state = newstate + + if(needs_update) + update_icon() + +/obj/item/weapon/gun/magnetic/update_icon() + cut_overlays() + if(state & ICON_CELL) + add_overlay("[icon_state]_cell") + if(state & ICON_CAP) + add_overlay("[icon_state]_capacitor") + if(state & ICON_BAD) + add_overlay("[icon_state]_red") + if(state & ICON_CHARGE) + add_overlay("[icon_state]_amber") + if(state & ICON_READY) + add_overlay("[icon_state]_green") + if(state & ICON_LOADED) + add_overlay("[icon_state]_loaded") - overlays = overlays_to_add ..() /obj/item/weapon/gun/magnetic/proc/show_ammo() @@ -83,10 +137,10 @@ if(capacitor) . += "The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%." - if(!cell || !capacitor) + if(state & ICON_BAD) . += "The capacitor charge indicator is blinking red. Maybe you should check the cell or capacitor." else - if(capacitor.charge < power_cost) + if(state & ICON_CHARGE) . += "The capacitor charge indicator is amber." else . += "The capacitor charge indicator is green." @@ -260,3 +314,10 @@ cell = new /obj/item/weapon/cell/high capacitor = new /obj/item/weapon/stock_parts/capacitor . = ..() + +#undef ICON_CELL +#undef ICON_CAP +#undef ICON_BAD +#undef ICON_CHARGE +#undef ICON_READY +#undef ICON_LOADED \ No newline at end of file diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm index c9688ab0d8..ec677a1b14 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm @@ -3,32 +3,25 @@ desc = "The Mars Military Industries MI-76 Thunderclap. A man-portable mass driver for squad support anti-armour and destruction of fortifications and emplacements." gun_unreliable = 0 icon_state = "railgun" - removable_components = FALSE - load_type = /obj/item/weapon/rcd_ammo origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_MAGNET = 4) - projectile_type = /obj/item/projectile/bullet/magnetic/slug power_cost = 300 w_class = ITEMSIZE_HUGE slot_flags = SLOT_BELT - loaded = /obj/item/weapon/rcd_ammo/large slowdown = 1 // Slowdown equals slowdown_worn, until we decide to import the system to differentiate between held and worn items fire_delay = 1 - var/initial_cell_type = /obj/item/weapon/cell/hyper - var/initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv + load_type = /obj/item/weapon/rcd_ammo + projectile_type = /obj/item/projectile/bullet/magnetic/slug + + cell = /obj/item/weapon/cell/hyper + capacitor = /obj/item/weapon/stock_parts/capacitor/adv + loaded = /obj/item/weapon/rcd_ammo/large + removable_components = FALSE + var/slowdown_held = 2 var/slowdown_worn = 1 var/empty_sound = 'sound/machines/twobeep.ogg' -/obj/item/weapon/gun/magnetic/railgun/New() - capacitor = new initial_capacitor_type(src) - capacitor.charge = capacitor.max_charge - - cell = new initial_cell_type(src) - if (ispath(loaded)) - loaded = new loaded - . = ..() - // Not going to check type repeatedly, if you code or varedit // load_type and get runtime errors, don't come crying to me. /obj/item/weapon/gun/magnetic/railgun/show_ammo() @@ -53,14 +46,15 @@ loaded = null visible_message("\The [src] beeps and ejects its empty cartridge.","There's a beeping sound!") playsound(src, empty_sound, 40, 1) + update_state() /obj/item/weapon/gun/magnetic/railgun/automatic // Adminspawn only, this shit is absurd. name = "\improper RHR accelerator" desc = "The Mars Military Industries MI-227 Meteor. Originally a vehicle-mounted turret weapon for heavy anti-vehicular and anti-structural fire, the fact that it was made man-portable is mindboggling in itself." icon_state = "heavy_railgun" - initial_cell_type = /obj/item/weapon/cell/infinite - initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/super + cell = /obj/item/weapon/cell/infinite + capacitor = /obj/item/weapon/stock_parts/capacitor/super fire_delay = 0 slowdown = 2 @@ -87,8 +81,8 @@ icon_state = "flechette_gun" item_state = "z8carbine" - initial_cell_type = /obj/item/weapon/cell/hyper - initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv + cell = /obj/item/weapon/cell/hyper + capacitor = /obj/item/weapon/stock_parts/capacitor/adv fire_delay = 0 @@ -109,6 +103,36 @@ list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=30, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)), ) +/obj/item/weapon/gun/magnetic/railgun/flechette/pistol + name = "flechette pistol" + desc = "The MI-6a Ullr is a small-form-factor railgun that fires flechette rounds at high velocity. Deadly against armour, but much less effective against soft targets." + icon_state = "railpistol" + item_state = "combatrevolver" + w_class = ITEMSIZE_SMALL + + cell = /obj/item/weapon/cell/super + capacitor = /obj/item/weapon/stock_parts/capacitor + + fire_delay = 0 + + slot_flags = SLOT_BELT + + slowdown = 0 + slowdown_held = 0 + slowdown_worn = 0 + + power_cost = 100 + load_type = /obj/item/weapon/magnetic_ammo/pistol + projectile_type = /obj/item/projectile/bullet/magnetic/flechette/small + loaded = /obj/item/weapon/magnetic_ammo/pistol + removable_components = TRUE + empty_sound = 'sound/weapons/smg_empty_alarm.ogg' + + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_handed_penalty=15, burst_accuracy=null, dispersion=null), + list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_handed_penalty=30, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)), + ) + /obj/item/weapon/gun/magnetic/railgun/heater name = "coil rifle" desc = "A large rifle designed and produced after the Grey Hour." @@ -119,8 +143,8 @@ removable_components = TRUE - initial_cell_type = /obj/item/weapon/cell/device/weapon - initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor + cell = /obj/item/weapon/cell/device/weapon + capacitor = /obj/item/weapon/stock_parts/capacitor fire_delay = 8 @@ -152,8 +176,8 @@ slowdown_held = 0.1 - initial_cell_type = /obj/item/weapon/cell/device/weapon - initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor + cell = /obj/item/weapon/cell/device/weapon + capacitor = /obj/item/weapon/stock_parts/capacitor slot_flags = SLOT_BELT|SLOT_HOLSTER @@ -181,8 +205,8 @@ icon_state = "railgun_sifguard" item_state = "z8carbine" - initial_cell_type = /obj/item/weapon/cell/high - initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv + cell = /obj/item/weapon/cell/high + capacitor = /obj/item/weapon/stock_parts/capacitor/adv slot_flags = SLOT_BACK diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm index 5c3b1f817b..c4e0ab5e9d 100644 --- a/code/modules/projectiles/projectile/magnetic.dm +++ b/code/modules/projectiles/projectile/magnetic.dm @@ -22,6 +22,13 @@ damage = 20 armor_penetration = 100 +/obj/item/projectile/bullet/magnetic/flechette/small + name = "small flechette" + icon_state = "flechette" + fire_sound = 'sound/weapons/rapidslice.ogg' + damage = 12 + armor_penetration = 100 + /obj/item/projectile/bullet/magnetic/flechette/hunting name = "shredder slug" armor_penetration = 30 diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index 1330c280b4..e6f7078032 100644 Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi index bb75b51054..54dba4f49e 100644 Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index b34cc9d91b..1a78788c3c 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 1a56a0be84..c5912ad299 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/railgun.dmi b/icons/obj/railgun.dmi index b47d8671a3..2ad3a2a56d 100644 Binary files a/icons/obj/railgun.dmi and b/icons/obj/railgun.dmi differ