• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Icon/Model/Spell Team Contest - Hive Member[+100 Rep]

Status
Not open for further replies.
@Kyrbi0 The 'dark paladin' archetype fits surprisingly well, if you think about it.

I'm an extremely angry person by nature, yes, but I'm not prone to unnecessary bouts of rage. I have a surprisingly good handle on it. However, I often do things motivated by my anger. An example of such a thing would be exercising, because you hate how you look, and hate seeing yourself in the mirror.

So what is one big, iconic thing about Direfury? Something he does that is motivated by anger? Something that is by no means a secret. My antitheism. My personal belief system. My hatred for the idea of gods and religion. Something we have discussed, and at length, I'm sure. Something more than a few people around here know about.

Sure, if you go by actual events in my past, a depiction of me as a berserker would be perfect. But the interview covered quite a few things, and drew from those. Go look at the artwork on the previous page. The anger in the eyes, the intense aesthetic.

The artwork tends to capture everything covered in the interview quite well, in rather symbolic ways.
For one, as I said, I much prefer being Direfury, over being me. I prefer the mask, as it feels more like me, than I do. Thus, the original artwork included a featureless mask, and an, admittedly slightly exaggerated version of my hair at its longest and thickest. Something I prefer.
-
Beyond that, I've had my fair share of strange encounters. The tattoos are something I intend to get, as a physical reminder of what was covered in the interview.
-
The book serves as an ideal representation of my Creed, with the chain serving as a visual representation of my connection to it.
-
The two skulls on the weapon directly reference an extremely disturbing dream of mine. One that I had during a period of my life focused on change, and self improvement.
-

Those are all things I can glean from simply looking at the artwork. How those specific points were implemented. They're largely spot on. Including the aforementioned intensity... I mean, come on, Kyrb. You've probably SEEN it piss me off when some droopy-eyed, drawling little homunculus tells me to chill out, or worse, calm down.

Simply put, a berserker would fit a depiction of me from a first glance. There are other things that are central to me as a character that I feel were picked up on rather well, through the interview, and friendship with @Stefan.K, who most likely picked up on these things over time.
 
Level 9
Joined
Mar 23, 2014
Messages
165
@Kyrbi0 If we were to characterize the person as who really he/her is, that would be also cool but boring. As a result you would probably see @Direfury as a writer with a huge brain and eyeglasses. Or me as a tall ass phone tech an evaluationed creature or something i don't know. But isn't the avatar means what you want to be? However it's mostly the medieval times we want to live in and sadly but true it's something impossible for us to do anymore.

If people ask you to create my Character.. what are you gonna do? Look at my avatar and create? (Which comes back to the point where our avatars are mostly who we want to be in our fantasy worlds) That works. Or ask me and i can describe me as a Caharacter i believe that the result would be more Exarch-ish xd This works too. On the other hand, if you ask me who really i am and you want to create a character out of me.. that will suck my friend.
Or if this is a concept that you're supposed to create the member as what they do in Hive and for Hive. We all pretty much do the same stuff :/ don't we?

About giving him a berserker look (idk if you thought about this by looking at his avatar)? I see an evil power in there and i believe a Dark Paladin can be a berserker. Who said he's going to bring peace in the guidance of the holy light using that skull-ed polearm? lol
 
Even besides all that, consider stuff like this.

latest
 
well that's a lot of talking o_O

I usually, when trying to imagine a character out of, well, someone, i take a look at what that person has done, I take a look at the resources, perhaps the most favorite model/texture one works with.. chat a bit to see the personality, and pretty much get a bit of an idea. @Apheraz Lucent , for an example really does good with the textures, icons and especially sorceress model =P so the amalgamation created by that was easy to put together. @Kyrbi0 is a fan of trolls, but if i were to pull on that side, i'd miss many other things, like that elder hydra, so he's a bit more mysterious.. @Direfury ..? well I kinda imagine him as a blacksmith, or engineer.. any sort of a very good craftsman. but every piece of armor or weapon on him would have a sinister secondary purpose, equally destructive like he is creative.
 
Level 11
Joined
Dec 19, 2012
Messages
411
1st code WIP from team : Sentinel (Best tem 10/10)
For some reason CnP the wurst code from VS will have no indent...
Wurst:
package MooseCharge

/*==================================================================================================*
*
* Spell Description :
*
* Not yet ready...
*
*===================================================================================================*
*
* Import ClosureTimers for :
* 1. uses class CallbackPeriodic */
import ClosureTimers

/*
* Import LinkedListModule for :
* 1. Turn class into LinkedList */
import LinkedListModule

/*
*==================================================================================================*
*
* Import Instructions :
*
* Not yet ready...
*
*==================================================================================================*
*
* Configuration :
*
* Configuration should be done in MooseCharge_config.wurst
*
/*================================================================================================*/





/*============================================Globals=============================================*/
/** Spell id*/
@configurable constant SPELL_ID = 'A000'

/** Spell required charging time*/
@configurable constant CHARGE_TIME = 2.0

/** Determine if spell is interruptable while caster is channelling*/
@configurable constant INTERRUPTABLE_CHANNEL = true

/** Determine if spell is interruptable while caster is charging*/
@configurable constant INTERRUPTABLE_CHARGING = true

/** Spell duration after completed charging time*/
@configurable constant SPELL_DURATION = 3.0

/** Unit's charging animation index*/
@configurable constant CHARGE_ANIMATION_INDEX = 1

/** Unit's charging animation speed*/
@configurable constant CHARGE_ANIMATION_SPEED = 1.

/** Starting charging speed*/
@configurable constant START_SPEED = 100.

/** Maximum charging speed*/
@configurable constant MAX_SPEED = 500.

/** Speed increase per second*/
@configurable constant ACCELERATION = 25.

/** Speed decrease per second after reached SPELL_DURATION*/
@configurable constant DEACCELERATION = 50.

/** Determine if deacceleration will still apply after hitting a unit*/
@configurable constant DEACCELERATE_AFTER_HIT = false

/** Periodic run time*/
@configurable constant PERIODIC_TIME = 0.03125

/** Acceleration speed increases per PERIODIC_TIME*/
constant ACCELERATION_PER_TICK = ACCELERATION*PERIODIC_TIME

/** Cargo hold ability id*/
constant CARGO_HOLD = 'Abun'

/** Function define the circumstances where if occur, channelling will be interrupted*/
@configurable function chanellingInterrupt(unit caster) returns bool
return false

/** Function define the circumstances where if occur, charging will be interrupted*/
@configurable function chargingInterrupt(unit caster) returns bool
return false
/*================================================================================================*/





/*=============================================Enums==============================================*/
enum SpellPhase
Channel
Charging
Deaccelerate
/*================================================================================================*/





/*================================================================================================*/
class Charge
use LinkedListModule

//----------------------Ordinary Globals----------------------
private unit caster

private real curSpeed = START_SPEED
private real timeLeft = CHARGE_TIME
//------------------------------------------------------------


//-----------------------Tuple Globals------------------------
private vec2 curPoint
private angle ang
//------------------------------------------------------------


//------------------------Enum Globals------------------------
private SpellPhase sp = Channel
//------------------------------------------------------------



//===================Creation/Destroy Functions===================
construct(unit caster)
this.caster = caster
..setAnimation(CHARGE_ANIMATION_INDEX)
..setTimeScale(CHARGE_ANIMATION_SPEED)
..setPropWindow(0.)
..addAbility(CARGO_HOLD)

this.curPoint = caster.getPos()

if Charge.size == 1
cbp.start(PERIODIC_TIME)

ondestroy
//remove all applied effects
this.caster
..removeAbility(CARGO_HOLD)
..setPropWindow(GetUnitDefaultPropWindow(this.caster))
..issueImmediateOrder("stop")

this.caster = null
Charge.size--

if Charge.size == 0
destroy cbp
//================================================================



//=========================Core Functions=========================
private static CallbackPeriodic cbp = (CallbackPeriodic cb) ->
begin
for instance in Charge
if instance.sp == SpellPhase.Channel
//-----------Phase 1 : Channel-----------
//if charging time is done
if instance.timeLeft <= 0
instance.sp = SpellPhase.Charging
instance.timeLeft = SPELL_DURATION
instance.ang = instance.caster.getFacingAngle()
//if interruptable and defined interrupt condition is true
else if INTERRUPTABLE_CHANNEL and chanellingInterrupt(instance.caster)
destroy instance
//------------End of Phase 1-------------
else if instance.sp == SpellPhase.Charging
//----------Phase 2 : Charging-----------
//------------End of Phase 2-------------
else if instance.sp == SpellPhase.Deaccelerate
//--------Phase 3 : Deaccelerate---------
//------------End of Phase 3-------------

instance.timeLeft -= PERIODIC_TIME
end
//================================================================

/*================================================================================================*/

function onChannel() returns bool
if GetSpellAbilityId() == SPELL_ID
new Charge(GetTriggerUnit())

return false

init
CreateTrigger()
..registerAnyUnitEvent(EVENT_PLAYER_UNIT_SPELL_CHANNEL)
..addCondition(Condition(function onChannel))

@IcemanBo
Team Sentinel requests a name change to "Best tem 10/10"
 
Darkfang concept art:
I will improve the quality of the photo later:
1c2cd9ec-8c03-4cc1-bbf8-9888c93c9edb-jpg.286386


Darkfang Concept history (I know it doesn't apply, but I think it is cool to give a background to a character appearance and abilities)

Darkfang was once a giant tarantula from the corrupted lands of Felwood, it used to consume deers, wolves, or any hapless creature that it could catch. The spider couldn't find any prey, and so it's hunger grew and grew even bigger, turning the spider insane in a feeding rage, consuming even it's own offspring in the despair. A special rage fillled the heart of the insect, that quiet feeding rage that fills crocodiles, serpents and spiders, creatures that await for their prey to come, in ambush.

Months passed, and with them a warlock came, a Human one, a powerful one, he and his felhunter walked through her territory, Darkfang sensed it, he and his pink flesh excited her stomach, but the Felhunter troubled her.

- Were is that dumb f** of an insect?, the Gnome told me he would pay me well for her legs.
The Felhunter noded, like if he was smelling something, the Warlock didn't notice, he just kept talking.
- There are just dried up corpses and dried webs all over the place, for all we know the damn spider should be dead already. -

The spider could understand it's words, the corruption didn't only make it giant, it made it more intelligent, clever. As the human walked the land she watched with her eight eyes, awaiting, tasting the moment, anticipating.

- There is so much dead sh** in this pla...-
The Felstalker thought that the only sh*t on the place was coming from his master's mouth, he was really interested in the spider, but then the words stopped, and it turned back, his Master was lying in a hole in the ground, immobilized between spider silk, the spider dind't only wait, it had laid traps all over the place, the Felhunter felt admiration over the beast, and looked at it's master with an evil smile, finally it could be free from the warlock's domination, from him and from the Legion, to roam and feast upon the weak mortals that fill the land, just as the spider does. He was about to step back and let his master die, but from the trees Darkfang attacked, lashing against the Felhunter, a bite of venom falling upon it's flesh, the demon managed to get the spider out from his back, and then they both locked stares, the Felhunter wanted to leave before, but the spider thought he would defend his master, the spider only wanted to eat as quick as possible, it couldn't let the prey scape, it couldn't let the felhunter help it. They both awaited for the first move of the other, but the demon grew impatient, the proud hound won't be beaten by a simple insect, he would strike and kill it as he had done against countless other creatures. He tackled, inserting his stings in the spider, attempting to drain it's power, but just as he did the spider lashed against him in madness, now a mortal insanity at the brink of death, fighting to survive, inserting her big fangs in the demonic creature's body, and unleashing all of the flesh disolving toxins in it, they both started to drain and feed upon each other, only one could win. The Felhunter hungered for magic and its magical tentacles were made for destroying magical energies, but the spider had hungered for months, it was starving, insane, and its venom was pure melting acid and it would drain all of the corrupted flesh, heart and brain of the Felhunter until there was nothing left, the Felhunter slowly knew it was his end, but, was it? The Felhunters are normally bound to the twisting nether, they are inmortal creatures, meant to serve the legion for eternity. But this end, in which they drained one another to death fused their souls, something never experienced, he would be bound in flesh and soul to the spider, fused, a sheer happiness filled the Felhunter soul, as his flesh united with the Spider and it started to mutate. No, he would no longer serve the Legion, nor would he serve his damn master once again, no, a vision filled it as his magic senses fused with the spider's senses, something more than a weak warlock or the Legion to serve, someone. As they fused the spider seemed to burn in black pitch shadow flames of red and purple, the vision, she had seen it as well, something to come, more than Felwood, something more than fragile weak preys.

The human warlock in the hole listened the fight outside, as he tried to burn the web slowly with felfire, he thought his demonic minion would save him, but then when he was about to finally break free he saw it, no longer a spider, no longer a felhunter, but something else. Black like the night with straws of crimson red, irradiating in shadows, with its fang oozing dark purple fel flames and with four felstings ready to devour and shred. The creature looked at it, and it looked through it's eight eyes, and through them the felstalker could look too, looking at it's former master once again in a smile. A thought blazed through it, he was always envious of the mortal creatures, as they ate and digested and tasted the flesh of their preys, they delighted in them, but he could only delight in the magical energies, the taste of flesh, for which it was really incapable to really know was unfamiliar, even it's tongue could only taste magic, now a gift was granted for both of them, the spider and the demon, to know the taste of flesh and the taste of magic alike, and share it with each other. The warlock screamed in repeated agony and horror as the monstrous creature stabbed him and bit him, splattering blood all over the place, ah, the human felt terror, but Darkfang felt joy, while it attacked and devoured gleefully, knowing that no flesh, no magic, no bones and no damn soul could scape her hunger.

They both the spider and the demon laughed inside and greeted each other souls, knowing they would get along really well.
 
Last edited:

Kyrbi0

Arena Moderator
Level 45
Joined
Jul 29, 2008
Messages
9,502
Darkfang concept art:
I will improve the quality of the photo later:
1c2cd9ec-8c03-4cc1-bbf8-9888c93c9edb-jpg.286386


Darkfang Concept history (I know it doesn't apply, but I think it is cool to give a background to a character appearance and abilities)

Darkfang was once a giant tarantula from the corrupted lands of Felwood, it used to consume deers, wolves, or any hapless creature that it could catch. The spider couldn't find any prey, and it's hunger grew and grew even bigger, turning the spider insane in a feeding rage, consuming even it's own offspring in the despair. A special rage fillled the heart of the insect, that quiet feeding rage that fills crocodiles, serpents and spiders, creatures that await for their prey to come, in ambush.

Months passed, and with them a warlock came, a Human one, a powerful one, he and his felhunter walked through her territory, Darkfang sensed it, he and his pink flesh excited her stomach, but the Felhunter troubled her.

- Were is that dumb f** of an insect?, the Gnome told me he would pay me well for her legs.
The Felhunter noded, like if he was smelling something, the Warlock didn't notice, he just kept talking.
- There are just dried up corpses and dried webs all over the place, for all we know the damn spider should be dead already. -

The spider could understand it's words, the corruption didn't only make it giant, it made it more intelligent, clever. As the human walked the land she watched with her eight eyes, awaiting, tasting the moment, anticipating.

- There is so much dead sh** in this pla...-
The Felstalker thought that the only sh*t on the place was coming from his master's mouth, he was really interested in the spider, but then the words stopped, and it turned back, his Master was lying in a hole in the ground, immobilized between spider silk, the spider dind't only wait, it had laid traps all over the place, the Felhunter felt admiration over the beast, and looked at it's master with an evil smile, finally it could be free from the warlock's domination, from him and from the Legion, to roam and feast upon the weak mortals that fill the land, just as the spider does. He was about to step back and let his master die, but from the trees Darkfang attacked, lashing against the Felhunter, a bite of venom falling upon it's flesh, the demon managed to get the spider out from his back, and then they both locked stares, the Felhunter wanted to leave before, but the spider thought he would defend his master, the spider only wanted to eat as quick as possible, it couldn't let the prey scape, it couldn't let the felhunter help it. They both awaited for the first move of the other, but the demon grew impatient, the proud hound won't be beaten by a simple insect, he would strike and kill it as he had done against countless other creatures. He tackled, inserting his stings in the spider, attempting to drain it's power, but just as he did the spider lashed against him in madness, now a mortal insanity at the brink of death, fighting to survive, inserting her big fangs in the demonic creature's body, and unleashing all of the flesh disolving toxins in it, they both started to drain and feed upon each other, only one could win. The Felhunter hungered for magic and its magical tentacles were made for destroying magical energies, but the spider had hungered for months, it was starving, insane, and its venom was pure melting acid and it would drain all of the corrupted flesh, heart and brain of the Felhunter until there was nothing left, the Felhunter slowly knew it was his end, but, was it? The Felhunters are normally bound to the twisting nether, they are inmortal creatures, meant to serve the legion for eternity. But this end, in which they drained one another to death fused their souls, something never experienced, he would be bound in flesh and soul to the spider, fused, a sheer happiness filled the Felhunter soul, as his flesh united with the Spider and it started to mutate. No, he would no longer serve the Legion, nor would he serve his damn master once again, no, a vision filled it as his magic senses fused with the spider's senses, something more than a weak warlock or the Legion to serve, someone. As they fused the spider seemed to burn in black pitch shadow flames of red and purple, the vision, she had seen it as well, something to come, more than Felwood, something more than fragile weak preys.

The human warlock in the hole listened the fight outside, as he tried to burn the web slowly with felfire, he thought his demonic minion would save him, but then when he was about to finally break free he saw it, no longer a spider, no longer a felhunter, but something else. Black like the night with straws of crimson red, irradiating in shadows, with its fang oozing dark purple fel flames and with four felstings ready to devour and shred. The creature looked at it, and it looked through it's eight eyes, and through them the felstalker could look too, looking at it's former master once again in a smile. A thought blazed through it, he was always envious of the mortal creatures, as they ate and digested and tasted the flesh of their preys, they delighted in them, but he could only delight in the magical energies, the taste of flesh, for which it was really incapable to really know was unfamiliar, even it's tongue could only taste magic, now a gift was granted for both of them, the spider and the demon, to know the taste of flesh and the taste of magic alike, and share it with each other. The warlock screamed in repeated agony and horror as the monstrous creature stabbed him and bit him, splattering blood all over the place, ah, the human felt terror, but Darkfang felt joy, while it attacked and devoured gleefully, knowing that no flesh, no magic, no bones and no damn soul could scape her hunger.

They both the spider and the demon laughed inside and greeted each other souls, knowing they would get along really well.
o_O

Um, that is some schweet concept art.
Is it Darkfang as in you?
 

Kyrbi0

Arena Moderator
Level 45
Joined
Jul 29, 2008
Messages
9,502
@IcemanBo
I know the Rule "Submissions must not be started before the beginning of the Contest" technically does not allow for this, but I'm asking for a special exemption (that I may someday campaign for general inclusion in Contests going forward...): Can we be allowed to reuse simple, non-entry specific stuff from previous maps/Contests/etc (see below)?

Basically, I'm hoping to copy/paste in basic tester functions (spawning the hero, refreshing cooldowns, spawning dummy allies & enemies for testing), as well as my little setup for Credits in the Quest Log, and the dozen triggers I have for spawning the hero, all from some old maps I've got (old Contest entries & stuff). It's not impossible to recreate, it's just sooo time consuming & I've had to rebuild from scratch sooo many times before. That kind of stuff.

I promise I've made everything else from scratch, after Nov 10th. : )
 
Demo map is part of the entry, and so technically maybe also of the submission, but lol yes, sure, you may use any pre-made triggers to set up your demo map for the good. The demo code per se won't be judged anyways. Same would go for showcase dummies, quests, etc. So no worries!: ) The limitation is really only meant for your personal resource submission that you will upload in section.
 

Kyrbi0

Arena Moderator
Level 45
Joined
Jul 29, 2008
Messages
9,502
Demo map is part of the entry, and so technically maybe also of the submission,
Well yeah. That's exactly how I started my post:
@IcemanBo
I know the Rule "Submissions must not be started before the beginning of the Contest" technically does not allow for this, but I'm asking for a special exemption...
; )

IcemanBo said:
...but lol yes, sure, you may use any pre-made triggers to set up your demo map for the good. The demo code per se won't be judged anyways. Same would go for showcase dummies, quests, etc. So no worries!: ) The limitation is really only meant for your personal resource submission that you will upload in section.
Vunderbar! Yeah, I knew/figured that was the case; it's been a Rule since as long as I can remember, one I've made sure was written explicitly in the Contests I've run/Hosted. : )

Thinking ahead for future Contests, one thought is to simply state explicitly that contestants can do what I'm doing now.
-However, that's tricky (requires honor code) & a challenge to consider all the things that should be covered.

Even better would be to simply provide each Contestant exactly what they need: this could be as easy as preparing the chosen "base template" map (e.g. Turtle Rock) with testing functions, credit tabs, etc (we should already be giving them a base map anyway). It has the added benefit of standardization (highly prized in the more serious, skill-based Contests)
-However, I'm not a big fan of giving the Host more work, and this is definitely non-trivial.

Hmm.
 
Well, here's WIP 1. Yes, my coding proccess is very disorganised :p

JASS:
library FactoryMode

    globals
  
        private constant real TIMEOUT = .03125
      
        unit FACTORY = null
        ExitPort FACTORY_EXIT = 0
        constant integer FACTORY_ON_CHARGE_UP        = 1
        constant integer FACTORY_ON_CHARGE_LIMIT     = 2
        constant integer FACTORY_ON_CHARGE_INTERVAL  = 3
      
        private trigger array EventTrig
        private hashtable PortsStorage = null
        private integer Factories = 0
        private FactoryMode array Factory
        private timer tmr = null
      
    endglobals
  
  
  
    private function FireTrigger takes integer ev, unit u, ExitPort port returns nothing
        set FACTORY = u
        set FACTORY_EXIT = port
        call TriggerEvaluate(EventTrig[ev])
        set FACTORY = null
        set FACTORY_EXIT = 0
    endfunction
  
    function RegisterFactoryEvent takes integer ev, code c returns nothing
        call TriggerAddCondition(EventTrig[ev], Condition(c))
    endfunction
  
  
  
    struct FactoryMode
  
        integer charges
        integer triggerThreshold
        integer limit
        real timeout
        real timeoutReset
        unit factory
      
        integer portsCount
      
        static method collectBiomass takes unit u returns nothing
      
        endmethod
      
        static method createTank takes integer tankType returns nothing
      
        endmethod
      
        static method getCharges takes FactoryMode this returns integer
            returns this.charges
        endmethod
      
        static method setCharges takes FactoryMode this, integer chargeCount returns nothing
            local integer i
            set this.charge = chargeCount
            set i = this.charge
            //Modify floating text
            if i >= this.triggerThreshold then
                loop
                    set i = i - this.triggerThreshold
                    exitwhen i < this.triggerThreshold then
                    call FireTrigger(FACTORY_ON_CHARGE_UP, this.factory, port)
                endloop
            endif
        endmethod
      
        private static method factoryInterval takes nothing returns nothing
            local integer i = 0
            local thistype this
            if Factories > 0 then
                loop
                    set i = i + 1
                    exitwhen i > Factories
                    set this = Factory[i]
                    set this.timeout = this.timeout - TIMEOUT
                    if this.timeout <= 0. then
                        set this.timeout = this.timeoutReset
                        call FireTrigger(FACTORY_ON_CHARGE_INTERVAL, this.factory, port)
                    endif
                endloop
            else
                call DestroyTimer(tmr)
            endif
        endmethod
      
        static method create takes real interval, unit u, integer chargeTrigger, integer chargeLimit returns thistype
            local thistype this = allocate()
            set this.charges = 0
            set this.triggerThreshold = chargeTrigger
            set this.limit = chargeLimit
            set this.timeout = interval
            set this.timeoutReset = interval
            set this.factory = u
            set this.portsCount = 0
            set Factories = Factories + 1
            set Factory[Factories] = this
            if tmr == null then
                set tmr = CreateTimer()
                call TimerStart(tmr, TIMEOUT, true, function thistype.factoryInterval)
            endif
            return this
        endmethod
      
    endstruct
  
  
  
    struct ExitPort
      
        static method getNext takes FactoryMode f returns thistype
            return LoadInteger(PortsStorage, f, i)
        endmethod
      
        static method getSpecific takes FactoryMode f, integer i returns thistype
            return LoadInteger(PortsStorage, f, i)
        endmethod
      
        static method getRandom takes FactoryMode f returns thistype
            return LoadInteger(PortsStorage, f, GetRandomInt(1, f.portCount))
        endmethod
      
        static method create takes FactoryMode f, real x, real y, real z returns thistype
            local thistype port = allocate()
            set f.portsCount = f.portsCount + 1
            call SaveInteger(PortsStorage, f, f.portsCount, port)
            return port
        endmethod
      
    endstruct
  
  
  
endlibrary
 
Been working on that all day. Still far from done, but here's my second WIP:
JASS:
library FactoryMode

    globals
   
        private constant real TIMEOUT = .03125
       
        unit FACTORY = null
        FactoryMode FACTORY_ID = 0
        constant integer FACTORY_ON_CHARGE_UP        = 1
        constant integer FACTORY_ON_CHARGE_LIMIT     = 2
        constant integer FACTORY_ON_CHARGE_INTERVAL  = 3
       
        private trigger array EventTrig
        private FactoryMode array Factory
       
        private hashtable PortsStorage = null
        private integer Factories = 0
        private timer tmr = null
       
    endglobals
   
   
   
    private function FireTrigger takes integer ev, unit u, FactoryMode f returns nothing
        set FACTORY = u
        set FACTORY_ID = f
        call TriggerEvaluate(EventTrig[ev])
        set FACTORY = null
        set FACTORY_ID = 0
    endfunction
   
    function RegisterFactoryEvent takes integer ev, code c returns nothing
        call TriggerAddCondition(EventTrig[ev], Condition(c))
    endfunction
   
   
   
    struct FactoryMode
   
        integer charges
        integer triggerThreshold
        integer limit
        integer slot
        real timeout
        real timeoutReset
        unit factory
       
        integer portsCount
       
        static method collectBiomass takes unit u returns nothing
       
        endmethod
       
        static method getCharges takes FactoryMode this returns integer
            return this.charges
        endmethod
       
        static method setCharges takes FactoryMode this, integer chargeCount returns nothing
            local integer i
            set this.charges = chargeCount
            set i = this.charges
            //Modify floating text
            if i >= this.triggerThreshold then
                loop
                    set i = i - this.triggerThreshold
                    exitwhen i < this.triggerThreshold
                    call FireTrigger(FACTORY_ON_CHARGE_UP, this.factory, this)
                endloop
            endif
        endmethod
       
        private static method factoryInterval takes nothing returns nothing
            local integer i = 0
            local thistype this
            if Factories > 0 then
                loop
                    set i = i + 1
                    exitwhen i > Factories
                    set this = Factory[i]
                    set this.timeout = this.timeout - TIMEOUT
                    if this.timeout <= 0. then
                        set this.timeout = this.timeoutReset
                        call FireTrigger(FACTORY_ON_CHARGE_INTERVAL, this.factory, this)
                    endif
                endloop
            else
                call DestroyTimer(tmr)
                set tmr = null
            endif
        endmethod
       
        private method destroy takes nothing returns nothing
            local integer i = 0
            local ExitPort port
            loop
                set i = i + 1
                exitwhen i > this.portsCount
                set port = LoadInteger(PortsStorage, this, i)
                call port.destroy()
            endloop
            call FlushChildHashtable(PortsStorage, this)
            set this.charges = 0
            set this.triggerThreshold = 0
            set this.limit = 0
            set this.slot = 0
            set this.timeout = 0.
            set this.timeoutReset = 0.
            set this.factory = null
            set this.portsCount = 0
            call this.deallocate()
        endmethod
       
        static method remove takes FactoryMode this returns nothing
            local integer i = this.slot
            local FactoryMode = nextF
            loop
                set nextF = Factory[i + 1]
                set Factory[i] = nextF
                set nextF.slot = i
                set i = i + 1
                exitwhen i > Factories
            endloop
            set Factories = Factories - 1
            call this.destroy()
        endmethod
       
        static method create takes real interval, unit u, integer chargeTrigger, integer chargeLimit returns thistype
            local thistype this = allocate()
            set this.charges = 0
            set this.triggerThreshold = chargeTrigger
            set this.limit = chargeLimit
            set this.timeout = interval
            set this.timeoutReset = interval
            set this.factory = u
            set this.portsCount = 0
            set Factories = Factories + 1
            set Factory[Factories] = this
            set this.slot = Factories
            if tmr == null then
                set tmr = CreateTimer()
                call TimerStart(tmr, TIMEOUT, true, function thistype.factoryInterval)
            endif
            return this
        endmethod
       
        private static method onInit takes nothing returns nothing
            set EventTrig[FACTORY_ON_CHARGE_UP]         = CreateTrigger()
            set EventTrig[FACTORY_ON_CHARGE_INTERVAL]   = CreateTrigger()
        endmethod
       
    endstruct
   
   
   
    struct ExitPort
       
        real x
        real y
        real z
        real facing
        FactoryMode fId
       
        method destroy takes nothing returns nothing
            set this.x = 0.
            set this.y = 0.
            set this.z = 0.
            set this.facing = 0.
            set this.fId = 0
            call this.deallocate()
        endmethod
       
        static method remove takes FactoryMode f, integer portNumber returns nothing
            local integer i = portNumber
            local thistype port = LoadInteger(PortsStorage, f, i + 1)
            call port.destroy()
            loop
                call RemoveSavedInteger(PortsStorage, f, i)
                call SaveInteger(PortsStorage, f, i, LoadInteger(PortsStorage, f, i + 1))
                set i = i + 1
                exitwhen i > f.portsCount
            endloop
            set f.portsCount = f.portsCount - 1
        endmethod
       
        static method getPortX takes thistype port returns real
            return port.x
        endmethod
       
        static method getPortY takes thistype port returns real
            return port.y
        endmethod
       
        static method getPortZ takes thistype port returns real
            return port.z
        endmethod
       
        static method getPortFacing takes thistype port returns real
            return port.facing
        endmethod
       
        static method getPortFactory takes thistype port returns FactoryMode
            return port.fId
        endmethod
       
        static method getSpecific takes FactoryMode f, integer i returns thistype
            local thistype port = LoadInteger(PortsStorage, f, i)
            if port == 0 then
                return LoadInteger(PortsStorage, f, f.portsCount)
            else
                return LoadInteger(PortsStorage, f, i)
            endif
        endmethod
       
        static method getRandom takes FactoryMode f returns thistype
            return LoadInteger(PortsStorage, f, GetRandomInt(1, f.portsCount))
        endmethod
       
        static method createUnit takes thistype port, integer unitid returns nothing
            local unit u = CreateUnit(GetOwningPlayer(port.fId.factory), unitid, port.x, port.y, port.facing)
            local unit rallyU = GetUnitRallyUnit(port.fId.factory)
            local destructable rallyD = GetUnitRallyDestructable(port.fId.factory)
            local location loc
            call SetUnitFlyHeight(u, port.z, 0.)
            if rallyU != null then
                if rallyU != port.fId.factory then
                    call IssueTargetOrderById(u, 851971, rallyU) //order smart
                endif
            elseif rallyD != null then
                call IssueTargetOrderById(u, 851971, rallyD) //order smart
            else
                set loc = GetUnitRallyPoint(port.fId.factory)
                call IssuePointOrderById(u, 851983, GetLocationX(loc), GetLocationY(loc)) //order attack
                call RemoveLocation(loc)
            endif
            set u = null
            set rallyU = null
            set rallyD = null
        endmethod
       
        static method create takes FactoryMode f, real X, real Y, real Z, real angle returns thistype
            local thistype port = allocate()
            set port.x = X
            set port.y = Y
            set port.z = Z
            set port.facing = angle
            set port.fId = f
            set f.portsCount = f.portsCount + 1
            call SaveInteger(PortsStorage, f, f.portsCount, port)
            return port
        endmethod
       
    endstruct
   
   
   
endlibrary
 
Well, because my team seems to be slightly conservative about the modeling, texturing and spells, at least let me show you a ''tease''.

BTNMrGoblin_wip1.png
BTNMrGoblin_wip2.png
BTNMrGoblin_wip3.png
BTNMrGoblin_wip4.png
BTNMrGoblin_wip5.png


And final icon in 64x64 with slight retouch
BTNMrGoblin2.png


I'm not a huge fan of the angle, I might redo it.
 
Curse you. I want to hate you for doing yourself but it's so good. :<
It's actually KILLCIDE and Direfury who rang me up saying = Dude there's a team contest, and we want to make Mr.Goblin!.
And I was like = haha sure! have a blast!, then he was like = want to be our Icon guy? And I was like = sure why not!

the rest is history... or will be, maybe. I don't know. will see I guess :)
 
Level 9
Joined
Mar 23, 2014
Messages
165
I've been waiting for my team so we could focus on the same concept but unfortunately they couldn't find enough time.. they are working hard tho.. anyways here i got some wips for direfury.
 

Attachments

  • direfury_portrait1.jpg
    direfury_portrait1.jpg
    97.7 KB · Views: 123
  • direfury_portrait2.jpg
    direfury_portrait2.jpg
    172.7 KB · Views: 152
  • direfury_portrait3.jpg
    direfury_portrait3.jpg
    143.7 KB · Views: 129
Last edited:
Here is the second code WIP:

JASS:
library OvermindSpellThree initializer Init requires /*

    *   ----------------------
    */  AllocationAndLinks, /*
    *   ----------------------
    *
    *       -   Contains the doubly linked list and custom allocation which is preferred by the coder.
    *       -   If you don't want extends array syntax, just change AllocLinkBundle to DoubleLink
    *         
    *   ----------------------
    */  TimerUtils,         /*
    *   ----------------------
    *
    *       -   Too lazy to create a timer that allows attachment of data.
    *
    *   ----------------------------
    */  optional CustomFunctions, /*
    *   ----------------------------
    *
    *       -   Allows a nice not-red debug setting, but otherwise useless.
    *
    *   --------------------------------
    */  DamageEvent,   DamageModify   /*
    *   --------------------------------
    *
    *       -   Allows the manipulation of damage
    */
 
    native UnitAlive takes unit id returns boolean
 
    ///! external ObjectMerger w3u hfoo "!000" umdl "dummy.mdx"
 
    globals
        private constant group ENUM_GROUP = CreateGroup()
        private unit enum_unit = null
    endglobals
 
    private constant function SPELL_ID takes nothing returns integer
        return 'A002'
    endfunction
 
    private constant function RAW_ID takes integer request returns integer
        if request == 0 then
            //  Returns the ID of the hatchery.
            return 'e001'
        elseif request == 1 then
            //  Returns the ID of the fel spiderlings
            return 'e002'
        endif
        return 0
    endfunction
 
    private constant function DATA takes integer request, integer level returns real
        if request == 0 then
            //  Returns the duration of the hive
            if level == 1 then
                return 10. //50.
            elseif level == 2 then
                return 15. //75.
            elseif level == 3 then
                return 20. //100.
            endif
        elseif request == 1 then
            //  Returns the effective detection range.
            //  Defaults to 150.
            return 150.
        elseif request == 2 then
            //  Returns the tick rate.
            //  Defaults to 1.
            return 1.
        elseif request == 3 then
            //  Returns the amount of mana burned around the hive
            if level == 1 then
                return 5.
            elseif level == 2 then
                return 7.
            elseif level == 3 then
                return 10.
            endif
        elseif request == 4 then
            //  Returns the amount of health rejuvenated by ratio.
            //  Only takes effect when used as a nydus canal.
            if level == 1 then
                return 0.1
            elseif level == 2 then
                return 0.12
            elseif level == 3 then
                return 0.16
            endif
        elseif request == 5 then
            //  Returns the range field for allowing mana burn
            //  Defaults to 500.
            return 500.
        elseif request == 6 then
            //  Returns the flag for allowing the hive to be invulnerable.
            //  Defaults to true (not equal to 0.)
            return 1.
        elseif request == 7 then
            //  Returns the damage dealt when hive (simulating death or actually dying)
            if level == 1 then
                return 85.
            elseif level == 2 then
                return 150.
            elseif level == 3 then
                return 220.
            endif
        elseif request == 8 then
            //  Returns half the span of the rect used to detect when the spider approaches.
            return 40.
        elseif request == 9 then
            //  Returns the speed of the missile
            //  Must correspond to the object data equivalent.
            return 1000.
        elseif request == 10 then
            //  Returns the frequency of the global timer
            //  Cannot be configured to the level of the unit
            return 1/32.
        elseif request == 11 then
            //  Returns the fade-in total duration.
            //  Cannot be configured to the level of the unit
            return 2.5
        elseif request == 12 then
            //  Returns the duration of the death animation
            //  Cannot be configured to the level of the unit
            return 5.
        endif
        return 0.
    endfunction
 
    globals
        private constant boolean REG_11_BOOL = 2.5 <= 0.
    endglobals
 
    private constant function MDL_FILE takes integer request returns string
        if request == 0 then
            return "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl"
        elseif request == 1 then
            return "Abilities\\Spells\\NightElf\\ManaBurn\\ManaBurnTarget.mdl"
        endif
        return ""
    endfunction
 
    private function real_GetDist takes real x1, real y1, real x2, real y2 returns real
        return SquareRoot((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2))
    endfunction
 
    //  Generates a module with the name DoubleLink_local. It has the property of a private module.
    //! runtextmacro link_module("local", "private")
    //! runtextmacro link_module("active", "private")
 
    private struct Data extends array
        implement AllocLinkBundle
        implement DoubleLink_local
        implement DoubleLink_active
     
        private static constant timer ACTIVE_TIMER = CreateTimer()
     
        //  Mode checker
        private integer mode
        private real mode_data
     
        /*  Part One
        *       -   This will store the unit, level, timer, target x, and target y for
        *           the successful creation of the hive. */
     
        private unit unit
        private unit hive
     
        private integer level
     
        private timer timer
     
        private real tx
        private real ty
     
        //  Part Two
        //  For speed purposes
        private static player feedback_player
     
        private real stored
        private integer eventtype
     
        //! runtextmacro search_list("private", "get", "unit", "next", "unit == id")
        //! runtextmacro search_list("private", "get_hive", "unit", "active_next", "hive == id")
     
        private method detach takes nothing returns nothing
            debug call BJDebugMsg("Attempting detach!")
            if head != 0 then
                debug call BJDebugMsg("detach: Head of list")
                if local_next != this then
                    debug call BJDebugMsg("detach: Search success")
                    set local_next.head = 1
                 
                    debug call BJDebugMsg(" ")
                    debug call BJDebugMsg("=============")
                    debug call BJDebugMsg("("+I2S(this)+").next = " + I2S(next))
                    debug call BJDebugMsg("("+I2S(this)+").prev = " + I2S(prev))
                    debug call BJDebugMsg("("+I2S(next)+").prev = " + I2S(next.prev))
                    debug call BJDebugMsg("("+I2S(prev)+").next = " + I2S(prev.next))
                    debug call BJDebugMsg(" ")
                 
                    call local_next.insert(next)
                 
                    debug call BJDebugMsg("("+I2S(this)+").next = " + I2S(next))
                    debug call BJDebugMsg("("+I2S(this)+").prev = " + I2S(prev))
                    debug call BJDebugMsg("("+I2S(next)+").prev = " + I2S(next.prev))
                    debug call BJDebugMsg("("+I2S(prev)+").next = " + I2S(prev.next))

                    debug call BJDebugMsg("=============")
                    debug call BJDebugMsg(" ")
                 
                debug else
                    debug call BJDebugMsg("detach: Search fail")
                endif
             
                set head = 0
                call pop()
            endif
            call local_pop()
        endmethod
     
        private method preDestroy takes nothing returns nothing
            call detach()
            if not UnitAlive(hive) then
                debug call BJDebugMsg("Unit is no longer alive")
                debug call BJDebugMsg("Removing from stack")
             
                call RemoveUnit(hive)
                set hive = null
            else
                debug call BJDebugMsg("Unit is still alive")
                debug call BJDebugMsg("Simulating Removal from stack")
             
                call PauseUnit(hive, true)
                call ShowUnit(hive, false)
             
                call SetUnitX(hive, 0)
                call SetUnitY(hive, 0)
             
                call SetWidgetLife(hive, GetUnitState(hive, UNIT_STATE_MAX_LIFE))
                call SetUnitOwner(hive, Player(15), false)
             
                if not (DATA(6, 0) != 0) then
                    call SetUnitInvulnerable(hive, true)
                endif
            endif
        endmethod
     
        private method destroy takes nothing returns nothing
            debug if active_head == 0 or mode == 1 then
                debug call BJDebugMsg("Error: Tried to destroy an instance that has not been prepared yet")
                debug return
            debug endif
         
            call preDestroy()
            call ReleaseTimer(timer)
         
            set unit = null
         
            set timer = null
         
            set tx = 0.
            set ty = 0.
            set mode_data = 0.
            set stored = 0.
         
            set head = 0
            set mode = 0
            set eventtype = 0
         
            call active_pop()
            call deallocate()
        endmethod
     
        //  Part two
        private static method hive_onDeathProxy takes nothing returns nothing
            local thistype this = GetTimerData(GetExpiredTimer())
            call destroy()
        endmethod
     
        private method hive_onDeath takes nothing returns nothing
            call PauseTimer(timer)
            call TimerStart(timer, DATA(12, 0), false, function thistype.hive_onDeathProxy)
         
            if eventtype != 1 then
                debug call BJDebugMsg("Hive simulating death animation")
                call SetUnitAnimation(hive, "death")
            debug else
                debug call BJDebugMsg("Hive death actuated!")
            endif
        endmethod
     
        private static method hive_onDeathEvent takes nothing returns nothing
            local thistype this = get_hive(GetTriggerUnit())
         
            if this != 0 then
                debug call BJDebugMsg("Hive death event detected!")
             
                set eventtype = 1
                call hive_onDeath()
            endif
        endmethod
     
        private static method hive_onFeedback_loop takes nothing returns nothing
            local thistype this = GetTimerData(GetExpiredTimer())
         
            set feedback_player = GetOwningPlayer(hive)
            set mode_data = mode_data - DATA(2, level)
         
            if mode_data > 0. then
                call GroupEnumUnitsInRange(ENUM_GROUP, GetUnitX(hive), GetUnitY(hive), DATA(5, level), null)             
                loop
                    set enum_unit = FirstOfGroup(ENUM_GROUP)
                    exitwhen enum_unit == null
                 
                    if UnitAlive(enum_unit) and IsUnitEnemy(enum_unit, feedback_player) then
                        if GetUnitState(enum_unit, UNIT_STATE_MAX_MANA) != 0 then
                            call DestroyEffect(AddSpecialEffectTarget(MDL_FILE(1), enum_unit, "chest"))
                         
                            call SetUnitState(enum_unit, UNIT_STATE_MANA, GetUnitState(enum_unit, UNIT_STATE_MANA) - DATA(3, level))
                            call UnitDamageTarget(hive, enum_unit, DATA(3, level), true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, null)
                         
                            set stored = stored + DATA(3, level)
                        endif
                    endif
                 
                    call GroupRemoveUnit(ENUM_GROUP, enum_unit)
                endloop
            else
                set eventtype = 2
                call hive_onDeath()
            endif
        endmethod
     
        private method hive_addFeedback takes nothing returns nothing
            call SetUnitInvulnerable(hive, false)
         
            if GetUnitAbilityLevel(hive, 'Aloc') == 0 then
                call UnitApplyTimedLife(hive, 'BTLF', mode_data)
            endif
         
            call TimerStart(timer, DATA(2, level), true, function thistype.hive_onFeedback_loop)
        endmethod
     
        private static method hive_runList takes nothing returns nothing
            local thistype this = thistype(0).active_next
         
            if thistype(0).active_head == 0 then
                call PauseTimer(ACTIVE_TIMER)
                return
            endif
         
            loop
                exitwhen this == 0
                if mode == 1 then
                    call DestroyEffect(AddSpecialEffect(MDL_FILE(0), GetUnitX(hive), GetUnitY(hive)))
                 
                    static if REG_11_BOOL then
                        call SetUnitVertexColor(hive, 255, 255, 255, 255)
                     
                        set mode = 2
                        call hive_addFeedback()
                    else
                        set mode_data = mode_data + (255)*DATA(10, 0)/DATA(11, 0)
                     
                        if mode_data >= 255 then
                            call SetUnitVertexColor(hive, 255, 255, 255, 255)
                         
                            set mode = 2
                            set mode_data = DATA(0, level)
                         
                            call hive_addFeedback()
                        else
                            call SetUnitVertexColor(hive, 255, 255, 255, R2I(mode_data))
                        endif
                    endif
             
                elseif mode == 2 then
             
                endif
             
                set this = active_next
            endloop
        endmethod
     
        public static method init takes nothing returns nothing
            local trigger t = CreateTrigger()
         
            call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DEATH)
            call TriggerAddCondition(t, function thistype.hive_onDeathEvent)
         
            set t = null
        endmethod
     
        //  Part one
        private method hive_create takes nothing returns nothing
            if hive == null then
                set hive = CreateUnit(GetOwningPlayer(unit), RAW_ID(0), tx, ty, 0)
            else
                call SetUnitOwner(hive, GetOwningPlayer(unit), true)
                call SetUnitPosition(hive, tx, ty)
             
                call PauseUnit(hive, false)
                call ShowUnit(hive, true)
             
                if GetUnitAbilityLevel(hive, 'Aloc') != 0 then
                    call UnitRemoveAbility(hive, 'Aloc')
                    call UnitAddAbility(hive, 'Aloc')
                endif
            endif
         
            set mode = 1
         
            call SetUnitVertexColor(hive, 255, 255, 255, 0)
            call SetUnitInvulnerable(hive, true)
         
            if GetLocalPlayer() == GetOwningPlayer(unit) then
                call SelectUnit(hive, true)
                call SelectUnit(hive, false)
            endif
         
            call active_push()
            set active_head = 1
         
            if thistype(0).active_head == 0 then
                call TimerStart(ACTIVE_TIMER, DATA(10, 0), true, function thistype.hive_runList)
            endif
         
            set thistype(0).active_head = thistype(0).active_head + 1
        endmethod
     
        private static method prepare_hive_flag takes nothing returns nothing
            local thistype this = GetTimerData(GetExpiredTimer())
         
            call hive_create()
        endmethod
     
        private method prepare_hive takes nothing returns nothing
            set timer = NewTimerEx(this)
            call TimerStart(timer, real_GetDist(GetUnitX(unit), GetUnitY(unit), GetSpellTargetX(), GetSpellTargetY())/DATA(9, 0), false, function thistype.prepare_hive_flag)
        endmethod
     
        static method create takes unit u returns thistype
            local thistype this = get(u)
            local thistype that
         
            debug call BJDebugMsg("Searching for unique instance")
            if this == 0 then
                debug call BJDebugMsg("Search failed; allocating instance for struct creation: thistype")
                set this = allocate()
                set unit = u
             
                set level = GetUnitAbilityLevel(u, SPELL_ID())
                set head = 1
             
                call push()
                call local_insert(this)
             
                set tx = GetSpellTargetX()
                set ty = GetSpellTargetY()
             
                call prepare_hive()
                return this
            endif
            debug call BJDebugMsg("Search matched: thistype(" + I2S(this) + ").")
         
            set that = allocate()
            set that.unit = unit
         
            set that.level = GetUnitAbilityLevel(unit, SPELL_ID())
            call that.local_insert(this)
         
            set that.tx = GetSpellTargetX()
            set that.ty = GetSpellTargetY()
         
            call that.prepare_hive()
            return that
        endmethod
    endstruct
 
    private function OnSpellEvent takes nothing returns nothing
        if GetSpellAbilityId() == SPELL_ID() then
            call Data.create(GetTriggerUnit())
        endif
    endfunction
 
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
     
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(t, function OnSpellEvent)
     
        call ForForce(bj_FORCE_PLAYER[0], function Data.init)
        set t = null
    endfunction

endlibrary

It has a lot of debug message lines, but it will be cleared out in the final update. I'll try to post what the spell currently does.

EDIT:

The spell shown is actually another spell, but the main spell based on the code above is the second spell cast.

Appending:

 
Last edited:
Level 9
Joined
Mar 23, 2014
Messages
165
Looking up... Interesting choice.
Thought it can be a good idea to go with. Im gonna see what comes as the result.

@Exarch very footman-y helm tho, but it is very fitting a rogue warrior like Dire
The helmet was designed different than this but i wanted to show the face more so i.. changed it. I still want to put an evil looking helmet to him.. i'll see.
 
Status
Not open for further replies.
Top