• 🏆 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.
well i am done .u. I completed what i wanted to make and should probably post it in the resource section tomorrow. can't say i'm completely happy, since i had to assemble, wrap, animate, and tweak all of the model myself. but its cohesive, works ingame, and has everything i wanted to add

although somehow i've managed to generate 2-3 glitches that i don't have a clue how to fix Ouo but that'll have to wait, for this darn thing to be done and dusted
 
Level 42
Joined
Oct 20, 2010
Messages
2,935
Here's a gif of all the WIP for the hero portrait
 

Attachments

  • HiveLadyWIP.gif
    HiveLadyWIP.gif
    3.9 MB · Views: 1,135
Last edited:
Level 35
Joined
Oct 9, 2006
Messages
6,392
Question, creating your own team.. you can't be only 2 people 1 doing both work right?

It would kinda spoil the idea of the contest if you could. I am currently doing icons, although I could also do either of the others, but its the cooperation with others and fitting things together with them that makes this interesting in my eyes.
 
Hey, everyone. This is the first spell of the Scourge (team), [API]

JASS:
scope OvermindSpellOne initializer Init

    globals
        /*
            A flag that basically allows debugging of functions
        */
        private constant boolean ALLOW_DEBUG = false
    endglobals
   
    /*
        Configurable functions:
       
            These are the functions which are okay to modify:
                RAW_ID(integer request)
               
                DATA(integer request, integer level)
               
                MDL_FILE(integer request)
               
            SPELL_DM(int req)
                -   A separate function that stores certain rawcodes to be used in the scope
                    By default, it returns 0. (not a float)
           
            DATA(int req, int lev)
                -   The most versatile function, this function can essentially serve as 
                    the softcoded Object Editor fields which can be tinkered with.
                    Defaults to 0f.
                   
                    Some requests indicate a default value for a requested instance. In
                    that case, if you need to modify, you can do so. However, those
                    that are not defined as defaulting to a certain value will not work
                    with your modifications.
                   
            MDL_FILE(int req)
                -   Another versatile function, this function stores the appropriate strings
                    to be used later on.
                    Defaults to "".
    */
   
    //  Spell raw code
    private constant function SPELL_ID takes nothing returns integer
        return 'A000'
    endfunction
   
    private constant function RAW_ID takes integer request returns integer
        if request == 0 then
            //  The illusion ability to be used
            return '0000'
        endif
        return 0
    endfunction

    private constant function DATA takes integer request, integer level returns real
        if request == 0 then
            //  Returns damage dealt per tick in puddle
            if level == 1 then
                return 25.
            elseif level == 2 then
                return 35.
            elseif level == 3 then
                return 50.
            endif
           
        elseif request == 1 then
            //  Returns damage dealt on puddle evaporation
            if level == 1 then
                return 50.
            elseif level == 2 then
                return 70.
            elseif level == 3 then
                return 90.
            endif
           
        elseif request == 2 then
            //  Returns the tick rate of the puddle.
            //  Defaults to 1.
            return 1.
           
        elseif request == 3 then
            //  Returns the duration of the illusion
            if level == 1 then
                return 10.
            elseif level == 2 then
                return 15.
            elseif level == 3 then
                return 20.
            endif
       
        elseif request == 4 then
            //  Returns damage received by the illusion
            if level == 1 then
                return 1.25
            elseif level == 2 then
                return 1.25
            elseif level == 3 then
                return 1.25
            endif
       
        elseif request == 5 then
            //  Returns the speed of the bile projectile
            //  Defaults to 700.
            return 700.
       
        elseif request == 6 then
            //  Returns the tick rate of the movement
            //  Also functions as the transition rate of visibility.
            return 1/50.
       
        elseif request == 7 then
            //  Returns the duration of transition of visibility.
            return 1.5
           
        elseif request == 8 then
            //  Returns the range check for damaging nearby units
            //  Defaults to 250.
            return 250.
        endif
        return 0.
    endfunction
   
    private constant function MDL_FILE takes integer request returns string
        if request == 0 then
            //  Returns the model string of the projectile
            return "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl"
        endif       
        return ""
    endfunction
   
    /*
        Spell code:
       
            This section deals with the actual mechanics of the spell. It is not recommended
        to modify the spell code other than inserting debug messages.
       
            The class is named Data since the class is encapsulated and does not need a detailed
        name.
       
            private class Data
                implement AllocLinkBundle
                    - Importing the coder's own allocation and linked list bundle
           
                private static code exec_code
                    - A variable generated to prevent a trigger evaluation and duplication of functions
                   
                private static timer EVAL
                    - A timer specifically for handling the list in the class.
                      Should not be destroyed.
                     
                private static boolean EVAL_ACT
                    - A flag to determine if the timer is running or not.
                   
                private integer flag
                    - A flag to determine the current phase of the spell.
                   
                private group illusions
                    - Formerly used to store illusions, only stores a
                      dummy unit as a member
                     
                private effect missile_fx
                    - Only used for the dummy unit as a projectile
                      model.
                     
                readonly unit unit
                    - The actual casting unit.
                   
                readonly unit illusion
                    - The current illusion unit.
                   
                readonly unit target
                    - The target of the ability.
                   
                readonly integer level
                    - An integer storing the spell level of the casting unit. (SPELL_ID()
               
                readonly RealGroup reals
                    - A variable that allows dynamic mapping of variables as they are requested.
                      For more info, see Essential Libraries/Real Group
                   
    */
   
    private struct Data extends array
        implement AllocLinkBundle
       
        private static code exec_code = null
       
        private static timer EVAL = null
        private static boolean EVAL_ACT = false
       
        private integer flag
        private integer flag_data
       
        private real fade
       
        private group illusions
       
        private effect missile_fx
       
        readonly unit unit
        readonly unit illusion
        readonly unit target
       
        readonly integer level
       
        readonly RealGroup reals
       
        private method destroy takes nothing returns nothing
            call reals.destroy()
            call DestroyGroup(illusions)
           
            set unit = null
            set target = null
           
            set illusions = null
           
            set reals = 0
            set level = 0
           
            set flag = 0
            set fade = 0
            set flag_data = 0
           
            call pop()
            call deallocate()
        endmethod
       
        static method get_group takes unit u returns thistype
            local thistype this = thistype(0).next
            loop
                exitwhen this == 0 or illusion == u
                set this = next
            endloop
            return this
        endmethod
       
        static method get takes unit u returns thistype
            local thistype this = thistype(0).next
            loop
                exitwhen this == 0 or unit == u
                set this = next
            endloop
            return this
        endmethod
       
        static method create takes unit u, unit targ returns thistype
            local thistype this = get(u)
           
            if this == 0 then
                set this = allocate()
                set unit = u
                set target = targ
                set level = GetUnitAbilityLevel(u, SPELL_ID())
               
                set fade = DATA(7, 0)
                set flag = 1
                set flag_data = 255
               
                set illusions = CreateGroup()
               
                call IssueImmediateOrderById(unit, 851972)
                call PauseUnit(unit, true)
               
                set reals = RealGroup.create()
                set reals.value = DATA(3, level)
               
                call reals.add(GetUnitX(unit))
                call reals.add(GetUnitY(unit))
               
                call push()
               
                if not EVAL_ACT then
                    call TimerStart(EVAL, DATA(6, 0), true, exec_code)
                    set EVAL_ACT = true
                endif
            endif
            return this
        endmethod
       
        private static unit damaged = null
        private static thistype damaged_this = 0
       
        private static method onManipulateDamage takes nothing returns nothing
            local thistype this
           
            if damaged != Damage.target then
                set this = get_group(Damage.target)
                set damaged_this = this
                set damaged = Damage.target
            else
                set this = damaged_this
            endif
           
            if this != 0 then
                set Damage.amount = Damage.amount * DATA(4, level)
            endif
        endmethod
       
        private static unit summoned = null
        private static unit summoned_illu = null
       
        private static thistype summoned_this = 0
       
        private static method onSummon takes nothing returns nothing
            local thistype this = summoned_this
           
            call DestroyTrigger(GetTriggeringTrigger())
            set summoned = GetSummonedUnit()
           
            call UnitRemoveAbility(summoned_illu, RAW_ID(0))
            call RecycleDummy(summoned_illu)
                   
            call SelectUnit(unit, false)
           
            call ShowUnit(unit, false)
            call SetUnitInvulnerable(unit, true)
           
            call SetUnitX(summoned, GetUnitX(unit))
            call SetUnitY(summoned, GetUnitY(unit))
           
            call PauseUnit(summoned, true)
               
            if GetLocalPlayer() == GetOwningPlayer(unit) then
                call SelectUnit(summoned, true)
            endif
           
            set illusion = summoned
        endmethod
       
        private method timer_onTick_enum takes integer i, integer i2 returns nothing
            local player p = GetOwningPlayer(unit)
            call GroupEnumUnitsInRange(ENUM_GROUP, reals[i].value, reals[i + 1].value, DATA(8, level), null)
            //! runtextmacro FoG_start()
                if IsUnitEnemy(enum_unit, p) and UnitAlive(enum_unit) then
                    call UnitDamageTarget(unit, enum_unit, DATA(i2, level), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, null)
                endif
            //! runtextmacro FoG_end()
            set p = null
        endmethod
       
        private static method timer_onTick takes nothing returns nothing
            local thistype this = GetTimerData(GetExpiredTimer())
            local integer i = 1
            loop
                exitwhen i >= reals.number_count
               
                call DestroyEffect(AddSpecialEffect(MDL_FILE(0), reals[i].value, reals[i + 1].value))
                call timer_onTick_enum(i, 0)
               
                set i = i + 2
            endloop
           
            set reals.value = reals.value - DATA(2, level)
            if reals.value <= 0 or not UnitAlive(illusion) then
                call ReleaseTimer(GetExpiredTimer())
                set i = 1
                loop
                    exitwhen i >= reals.number_count
               
                    call DestroyEffect(AddSpecialEffect(MDL_FILE(0), reals[i].value, reals[i + 1].value))
                    call timer_onTick_enum(i, 1)
               
                    set i = i + 2
                endloop
                set fade = 1.5
                set flag = 4
               
                call UnitDamageTarget(unit, illusion, 0, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, null)
                call KillUnit(illusion)
           
                set illusion = null
               
                call PauseUnit(unit, false)
               
                call ShowUnit(unit, true)
                call SetUnitInvulnerable(unit, false)
               
                call SetUnitX(unit, reals[3].value)
                call SetUnitY(unit, reals[4].value)               
               
                call SelectUnit(unit, true)
            endif
        endmethod
       
        private method actions takes nothing returns nothing
            local trigger detector
           
            local unit illu
           
            local real r
           
            local real r1
            local real r2
            local real r3
            local real r4
           
            if flag == 1 then
                set flag_data = Math.int_max(R2I(flag_data - (flag_data - 0)/fade*DATA(6, 0)), 0)
                call SetUnitVertexColor(unit, 255, 255, 255, flag_data)
               
                set fade = fade - DATA(6, 0)
               
                call DestroyEffect(AddSpecialEffect(MDL_FILE(0), reals[1].value, reals[2].value))
               
                if fade <= 0 then
                    set illu = GetRecycledDummyAnyAngle(GetUnitX(unit), GetUnitY(unit), GetUnitFlyHeight(unit))
                    set summoned_illu = illu
                   
                    call UnitAddAbility(illu, RAW_ID(0))
                    call SetUnitOwner(illu, GetOwningPlayer(unit), true)
                   
                    set detector = CreateTrigger()
                    call TriggerRegisterUnitEvent(detector, illu, EVENT_UNIT_SUMMON)
                    call TriggerAddCondition(detector, function thistype.onSummon)
                   
                    set detector = null
                   
                    set summoned_this = this
                    call IssueTargetOrderById(illu, 852274, unit)
                   
                    set illu = null
                   
                    set fade = 0.5
                   
                    set flag = 2
                    set flag_data = 0
                   
                    set summoned = null
                   
                    call TimerStart(NewTimerEx(this), DATA(2, 0), true, function thistype.timer_onTick)
                endif
               
            elseif flag == 2 then
           
                if fade == 0.5 then
                    set illu = illusion
                   
                    call SetUnitAnimation(illu, "attack")
                    call QueueUnitAnimation(illu, "stand")
                   
                    set illu = null
                elseif fade <= 0 then
                    set illu = illusion
                   
                    call PauseUnit(illu, false)
                   
                    set illu = GetRecycledDummy(reals[1].real, reals[2].real, GetUnitFlyHeight(illu), Math.radA(reals[1].real, reals[2].real, GetUnitX(target), GetUnitY(target)))
                    set missile_fx = AddSpecialEffectTarget(MDL_FILE(0), illu, "origin")
                   
                    call GroupAddUnit(illusions, illu)
                   
                    set flag = 3
                    set fade = 0
                   
                    set illu = null
                    return
                endif
               
                set fade = fade - DATA(6, 0)

            elseif flag == 3 then
           
                set illu = FirstOfGroup(illusions)
               
                set r1 = GetUnitX(target)
                set r2 = GetUnitY(target)
               
                set r3 = GetUnitX(illu)
                set r4 = GetUnitY(illu)
               
                set r = Math.rad(GetUnitX(illu), GetUnitY(illu), r1, r2)
               
                if Math.dist(GetUnitX(illu), GetUnitY(illu), r1, r2) <= DATA(5, level)*DATA(6, 0) then
                    call reals.add(r1)
                    call reals.add(r2)

                    call SetUnitX(illu, reals[3].real)
                    call SetUnitY(illu, reals[4].real)
                   
                    call DestroyEffect(missile_fx)
                    set missile_fx = null
                   
                    call DummyAddRecycleTimer(illu, 1.)
                    set flag = 0
                else
                    call SetUnitX(illu, GetUnitX(illu) + DATA(5, level)*DATA(6, 0)*Cos(r))
                    call SetUnitY(illu, GetUnitY(illu) + DATA(5, level)*DATA(6, 0)*Sin(r))
                   
                    call SetUnitFacing(illu, r*bj_RADTODEG)                   
                endif
               
                set illu = null
           
            elseif flag == 4 then
               
                set flag_data = (R2I(flag_data - (flag_data - 255)/fade*DATA(6, 0)))
                call SetUnitVertexColor(unit, 255, 255, 255, flag_data)
               
                set fade = fade - DATA(6, 0)
               
                call DestroyEffect(AddSpecialEffect(MDL_FILE(0), reals[1].value, reals[2].value))
                call DestroyEffect(AddSpecialEffect(MDL_FILE(0), reals[3].value, reals[4].value))
               
                if fade <= 0 then
                    set flag_data = 255
                    call SetUnitVertexColor(unit, 255, 255, 255, flag_data)
                   
                    call destroy()
                endif
            endif
        endmethod
       
        private static method timer_onLoop takes nothing returns nothing
            local thistype this = thistype(0).next
            local integer i = 0
            loop
                exitwhen this == 0
               
                //  On timer loop
                call actions()
               
                set this = next
                set i = i + 1
            endloop
            if i == 0 then
                call PauseTimer(EVAL)
                set EVAL_ACT = false
            endif
        endmethod
       
        private static method onInit takes nothing returns nothing
            set EVAL = CreateTimer()
           
            set exec_code = function thistype.timer_onLoop
           
            call Damage.registerModifier(function thistype.onManipulateDamage)
        endmethod
    endstruct
   
    private function OnSpellEffect takes nothing returns nothing
        if GetSpellAbilityId() == SPELL_ID() then
            call Data.create(GetTriggerUnit(), GetSpellTargetUnit())
        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 OnSpellEffect)
       
        set t = null
    endfunction
endscope

There are a lot of requirements in the script, but its' a heavy price to pay in exchange for some modularity. (I still prefer custom constructors, though)
 
Level 9
Joined
Mar 23, 2014
Messages
165
It would kinda spoil the idea of the contest if you could. I am currently doing icons, although I could also do either of the others, but its the cooperation with others and fitting things together with them that makes this interesting in my eyes.
The reason i was asking that question is becauase it can be hard to create a 3 member team especially when only 3 weeks left. Opposite to your saying i cannot do either of the other.. i only have 1 friend who can do 1 other that's the problem.
I am hoping you can put me in a team @IcemanBo
 
The reason i was asking that question is becauase it can be hard to create a 3 member team especially when only 3 weeks left. Opposite to your saying i cannot do either of the other.. i only have 1 friend who can do 1 other that's the problem.
With @RED BARON together all aspects are potentially covered. ;)
 
Hey, everyone. This is the first spell of the Scourge (team), [API]
How many you plan do make? @venger07 oh, sorry, ok. I will remove you as modeler then.
I wonder , @MyPad, with which team are working then. ;)

stein123 = 2D Art, stonneash = Coding, FerSZ = modeling
Added. What team name/color you have?
 

Chaosy

Tutorial Reviewer
Level 40
Joined
Jun 9, 2011
Messages
13,182
Second code wip. Mostly utility stuff such as filtering out certain units, some BJ function removal, leak cleanup etc.

JASS:
native UnitAlive takes unit id returns boolean
//! zinc
    library Charm requires Missile, TimedUnitScale, TimerUtils, GroupTools {
  
        constant real GROW_TIME = 1;
        constant integer SPELL_ID = 'A003';
        constant real MANIFEST_COLOR = 80;
        constant string MANIFEST_SPAWN_EFFECT = "Aph Effect.mdx";
        constant string MANIFEST_SPAWN_MISSILE = "aph Missile.mdx";
        constant real MANIFEST_SHRINK = 10;
        constant real MANIFEST_DURATION = 10;
      
        hashtable hash = InitHashtable();
        group g;

        function stun(unit u, real dur) {
            udg_STE_TARGET = u;
            udg_STE_DURATION = dur;
            udg_STE_STACK_TIME = true;
            udg_STE_ADD_STUN = true;
            TriggerEvaluate(udg_STE_TRIGGER);
        }
  
        struct Spawn {
            static method onFinish (Missile missile) -> boolean {
                timer t;
                integer h;
                unit target = LoadUnitHandle(hash, missile, 0);
                integer id = GetUnitTypeId(target);
                unit u = CreateUnit(Player(13), id, missile.x, missile.y, missile.angle);
              
                DestroyEffect(AddSpecialEffect(MANIFEST_SPAWN_EFFECT, GetUnitX(u), GetUnitY(u)));
                stun(u, GROW_TIME);
                SetUnitInvulnerable(u, true);
                SetUnitVertexColorBJ(u, MANIFEST_COLOR, MANIFEST_COLOR, MANIFEST_COLOR, 60);
                SetUnitScalePercent(u, MANIFEST_SHRINK, MANIFEST_SHRINK, MANIFEST_SHRINK);
                UnitScale[u].apply(1, GROW_TIME);
              
                t = NewTimer();
              
                h = GetHandleId(t);
              
                SaveBoolean(hash, GetHandleId(u), 1, true);
              
                SaveUnitHandle(hash, h, 0, u);
                SaveUnitHandle(hash, h, 1, target);
              
                TimerStart(t, GROW_TIME, false, function() {
                    timer t = GetExpiredTimer();
                    integer id = GetHandleId(t);
                    unit u = LoadUnitHandle(hash, id, 0);
                    unit origin = LoadUnitHandle(hash, id, 1);
                  
                    IssueTargetOrder(u, "attack", origin);
                  
                    SetUnitInvulnerable(u, false);
                    UnitApplyTimedLife(u, 'BTLF', 10);
                  
                    FlushChildHashtable(hash, id);
                    ReleaseTimer(t);
                  
                    SaveUnitHandle(hash, GetHandleId(u), 0, origin);
                  
                    t = null;
                    u = null;
                    origin = null;
                });
              
                FlushChildHashtable(hash, missile);
              
                u = null;
                target = null;
                t = null;
                return true;
            }
            module MissileStruct;
        }
      
        function groupLoop() {
            unit u = GetEnumUnit();
            real x = GetUnitX(u);
            real y = GetUnitY(u);
          
            Missile m =  Missile.create(x, y, 75, GetRandomReal(0, 360), 400, 50);
          
            SaveUnitHandle(hash, m, 0, u);
          
            m.source    = GetTriggerUnit();
            m.speed     = 10.;
            m.model     = MANIFEST_SPAWN_MISSILE;
            m.arc       = bj_PI/4;
            m.owner     = GetTriggerPlayer();
            Spawn.launch(m);
          
            u = null;
        }
      
        function isManifestation(unit u) -> boolean{
            return LoadBoolean(hash, GetHandleId(u), 1);
        }
      
        function onCastFilter(unit u, player p) -> boolean {
            return UnitAlive(u) && !isManifestation(u) && IsUnitEnemy(u, p);
        }
      
        function onCast() {
            real x = GetSpellTargetX();
            real y = GetSpellTargetY();
            unit u = GetSpellAbilityUnit();
            integer h;
          
            g = NewGroup();
            GroupUnitsInArea(g, x, y, 300);
          
            h = GetHandleId(g);
            SavePlayerHandle(hash, h, 0, GetOwningPlayer(u));
          
            ForGroup(g, function () {
                unit u = GetEnumUnit();
                player p = LoadPlayerHandle(hash, GetHandleId(g), 0);
                if(!onCastFilter(u, p)) {
                    GroupRemoveUnit(g, u);
                }
                p = null;
                u = null;
            });
          
            FlushChildHashtable(hash, h);
          
            ForGroup(g, function groupLoop);
            ReleaseGroup(g);
            u = null;
        }
      
        function filter() -> boolean{
            return GetSpellAbilityId() == SPELL_ID;
        }
      
        function isSet(unit u) -> boolean {
            return u != null;
        }
      
        function onDamage() {
            unit origin = LoadUnitHandle(hash, GetHandleId(udg_DamageEventSource), 0);
            if (origin != udg_DamageEventTarget && isSet(origin)) {
                udg_DamageEventAmount = 0.00;
            }
            origin = null;
        }
      
        function onDeathFilter() -> boolean{
            return isManifestation(GetFilterUnit());
        }
      
        function onDeath() {
            FlushChildHashtable(hash, GetHandleId(GetTriggerUnit()));
        }
      
        function onInit() {
            trigger t = CreateTrigger();
            TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT);
            TriggerAddCondition(t, Condition(function filter));
            TriggerAddAction(t, function onCast);
          
            t = CreateTrigger();
            TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DEATH);
            TriggerAddCondition(t, Condition(function onDeathFilter));
            TriggerAddAction(t, function onDeath);
          
            t = CreateTrigger();
            TriggerRegisterVariableEvent(t, "udg_DamageModifierEvent", EQUAL, 1.00);
            TriggerAddAction(t, function onDamage);
          
          
          
            t = null;
        }
    }
//! endzinc

Which BJ functions are ok? I feel like the RegisterAnyUnitBJ is totally fine, it does not seem to contain unnecessary code.
 
Level 26
Joined
Jun 5, 2008
Messages
1,767
My kidney stones aren't that bad, I think. Although I am saying this with morphine in my system, so idonno. The kidney stones she must've suffered with must've been big as hell. The biggest issue I am facing is figuring out what to eat. Because I've basically lived on a diet of meat, chicken, salt and spices. Which combined with my genetic kidney disease probably is why I ended up having kidney stones again, I've had it once before.

If anyone of you guys know any good food to eat for people with kidney stones, leave a comment on my profile (As to not clutter this thread too much). The biggest issue now is basically hunger pains. You drink so much water that you basically piss out the nutrients and well, that's not a good thing. So far, I've lived on carrot soup. Because I was informed that Potatoes, Yellow Onions and Carrots are good to eat to avoid kidney stones. Red paprika appears to be good too, so I now I am equipped with something to eat for breakfast too.
 
@Kyrbi0 I much prefer the idea that this contest is more about depicting who the person is, rather than a simple avatar rip, or a parody of the chosen user(Distilling you, for example, into a Jungle Troll wearing too much money's worth of Jungle Troll memorabilia. There's more to you than that). So I agreed to share my thoughts, to give them a better understanding of my person, my values, and some of the events that have stayed with me the most. Somewhat like an interview.

The first draft of the character seemed more fitting, with long, wild berserker hair, and a featureless, eyeless mask. The idea of a Dark Paladin actually makes sense, along with that general aesthetic. Depicting my anti-theism and the anger behind it. My willingness to more identify with my persona, rather than my actual name and face.

I'm actually rather pleased with the amount of symbolism in the concept. Though I was hoping other teams in the contest would do the same with their entries. Rather than, say, making a model of Keiji as a Geomancer because he's a terrainer.
 

Kyrbi0

Arena Moderator
Level 44
Joined
Jul 29, 2008
Messages
9,487
@Direfury
This is very interesting to me, and if I didn't see this Contest as really more of a "for fun" thing, I'd be a lot more concerned about the disparity you illuminate. However, I wouldn't be me if I hadn't given it waaay too much thought:


Right from the get-go, I read the Contest Theme & thought "huh. Huh? Hm..." "In What Way are we supposed to represent our chosen User?" was the primary question; the manner by which we create a rendition seems like the most important question to this Contest (especially if you consider adhering to the Contest Theme a matter of importance to the Judges (nothing in Criteria, but still probably important)).

After consideration, it seemed to me that our entries must needs exist on a 'spectrum of representation fidelity'; that is, how faithfully-to-the-source (i.e. the user) we represent things. This is complicated by having to 'make a Hero fit for Warcraft', which can mean a lot of different things to people.

I'll take myself as an example, since I know me pretty well. : )

On the extreme-fidelity end of the spectrum would be what I'd call "Level 0", something akin to literally recreating that individual in Warcraft; i.e. a hero named Kyrbi0 (hero class name: "Warcraft Modder", lol) who's just a regular human. Caucasian, average height & weight, brown hair and a bit of facial shrubbery... With some ability related to an actual IRL capability of mine (say, spellchecking or typing too much xD).

Seems pretty boring, aye? I doubted this was what was intended (but it *is* technically within the purview of the Contest, on the extreme end)


So with that as a boundary, moving in the other direction we get further away from "perfectly" recreating the individual, and incorporate an increasing amount of "artistic liberty/creativity". Let's call it "Level 1". So maybe this "Kyrbi0" hero is some kind of Jungle Troll (easy). But my model looks like myself (or my avatar), and my Jungle Troll is decked out with, like, a keyboard or a pair of headphones or something. His ability might be something I do IRL, but turned Warcraft-y (like "typing too much" is casting a group Silence that deals DoT or something).

This is better, methinks. I don't know where on the spectrum it is, but it seems like the kind of thing that @Misha 's team is doing with @Apheraz Lucent (because what Warcraft hero is carrying around a giant paintbrush & paint palette? That's definitely an out-of-game homage to her Skillz of an Artist!).


Even further up the spectrum is, I would submit, coming up with a Warcraft class that most closely 'fits' or represents the User. Let's call it "Level 2". This leads even further away from "recreating" an individual, but introduces more chance for artistic liberties & more Warcraft-iness. I would classify what @Exarch 's team is doing to you: Are you literally an Anti-Paladin? Do you ever walk around in full plate or cast dark-paladin spells or wield a skull-bedecked spear-sword thing? I hope not Of course not. But it represents you as a person, your mentality, philosophy, idealogy, etc. It's much more like as if you were playing D&D. Barring some kind of crazy experimentation, what class/race/alignment combo would best represent you?

Despite my earlier protestations, I can see now why it fits rather well. I'm actually really impressed with Exarch & Co for going to the trouble of 'interviewing' you; personally, I kinda think we should all be doing that, to really get a handle on who our chosen User is & how best to represent them (perhaps, in a future version of this Contest, the Host could provide a short little questionnaire for this purpose, to standardize things & make it easier to do).
If we again take me as an example, my "Kyrbi0" hero might now not only be a Jungle Troll, but would perhaps (due to my general lack of physicality but strong mind) be some sort of caster-type hero; maybe a "Medicine Mon" or something flimsy but smart. xD The spell might be some kind of generic spell associated with that class (might instead be something about myself, turned into a spell?)

This, I might submit, is the best way to do this Contest.


Now, I think one can go further up the spectrum. In fact, part of why I've been thinking so hard about this & waiting for the chance to say something was because I was worried my team & I had done that very thing. That is to say, one picks a User & starts to make a hero, but perhaps takes a few too many artistic liberties, or doesn't really craft a Hero Class that "fits" the User in the same way as Level 2 does, but instead makes something that really fits into Warcraft. In a way, this might be like making a sick-awexome Jungle Troll Warlord hero & naming it Kyrbi0; yeah I love Jungle Trolls & it's cool, fits into Warcraft, but it's kinda not what I'm about (as a person). I'm not very physical, or strong, or violent.

I'm not sure yet what to do about that. But I've already pre-emptively apologized to Deolrin, explaining that our entry doesn't reflect how we think of him. xD So hopefully that helps.

(Note: This whole just sorta ignores the "superficiality" of the representation; i.e. to your "Keiji => Geomancer because Terrainer" point. I suppose it's superficial to simply base things off of the avatar (i.e. would I really be a Jungle Troll? I may like them the most, but honestly I'm pretty normal & attached to my creature comforts of modern living; Human or Dwarf would fit better), but we've gotta start somewhere, and we can't all be Humans (or we can, but at closer to a Level 0/1 approach, as aforementioned))


Everything else I didn't comment on in the above:
@Kyrbi0 (Distilling you, for example, into a Jungle Troll wearing too much money's worth of Jungle Troll memorabilia. There's more to you than that)
Lol, I appreciate that. Especially because I have nearly no Jungle Troll memorabilia IRL. xD

Direfury said:
The first draft of the character seemed more fitting, with long, wild berserker hair, and a featureless, eyeless mask. The idea of a Dark Paladin actually makes sense, along with that general aesthetic. Depicting my anti-theism and the anger behind it. My willingness to more identify with my persona, rather than my actual name and face.
Those are... Good points. I guess I just think 'Direfury' and think (not incidentally, given your name; but also because of our conversations) and think 'anger', which is best typified by the Berserker/Barbarian archetype. But an Anti/Dark-Paladin makes sense, too, I suppose.

~

Discuss! Lol.
 

deepstrasz

Map Reviewer
Level 68
Joined
Jun 4, 2009
Messages
18,709
Those are... Good points. I guess I just think 'Direfury' and think (not incidentally, given your name; but also because of our conversations) and think 'anger', which is best typified by the Berserker/Barbarian archetype. But an Anti/Dark-Paladin makes sense, too, I suppose.
Thing is, if this contest is user vote based, then those users would expect a Hive user turned to character be as they see him on the site not how they actually feel. People don't know you behind the screen.
 
Status
Not open for further replies.
Top