RPG Savage Creed

SerraAvenger

Cuz I can
Reaction score
234
dreams come true!

test it once
i get back to my home computer
test it twice
if I really love it?

will give feedback once tested ; )
 

GooS

Azrael
Reaction score
154
Well, where to start.

The chat system seems like it could be epic, but as is the text stacks and the green color kills my eyes.

What's the peasant for?

I didn't play long enough for abilities, since a wolf crit me and I got no ress.

The ranged morph turns one into raven form, which is what it's supposed to do, i guess, but doubt you want one to really turn into a raven :) (T(r)oll Staff)

God awful terrain, really, couldn't find a<ny part of it that appealed to me.
"I doubt there's anything down here more terrifying than what we've faced already!"
Quoted for truth

Anyways, my guess is there's more going down behind the scenes than I can see, Quest, item, chat, ability etc. systems that have great potential!

//==GooS
 

Jesus4Lyf

Good Idea™
Reaction score
397
>just realised the date... Are you still doing [this]?
At least not currently. I've indefinitely postponed this project due to university and various other slight disappointments with the project. Such as the map being so detailed in code that it requires players to restart Warcraft III before and after playing it, otherwise they're likely to desynch (if they don't restart it after, they will suddenly desynch 2 minutes into their games).

So when I state intentions for the map, understand that they may or may not ever come 'round.

Feedback responses:
>The text for the systems stays on the screen for too long (it gets annoying).
Alpha version. They shouldn't be there in final release versions. :)

>What is that peasant for?
Err. That was accidentally left over from a system I was testing. <_< And yea, I was aware of it... Just didn't seem important enough to release a new version over.

>Some in-game messages would be nice, so first time players can understand what to do.
Talking to NPCs is kind of meant to drive that. I suppose I could suggest that they do that (if I haven't already).

>How do you get abilities?
Currently certain quests and also killing creeps. Abilities are items that you wield, and slot into an ability slot. :)

>Awesome chat system!
Thanks! :D

>Are you supposed to get anything for finishing Assasination? Because I didn't.
Off memory, no. Just a lot of reputation within the faction. But the quest system is written in a way that different factions can give different prizes, I just haven't actually made them do that yet...

>That chat system is indeed really impressing. It just needs some nice art because now it looks kinda terrible.
Yeah. I actually have plans to redo it completely. Instead of using text tags (which have that darn shadow effect) I could use screen messages in the same way. That would fix it up a lot. :)

>Also the terrain is pretty horrible too.
Yep. I'm so not a terrainer. :(
I'd probably need someone else to do this.

>Didnt really test any spells, but Im sure that they are top quality and nothing less.
They're not Sharl and Sandman (those took a full day to write each), but at least they're interesting in general.

>the text stacks
Another reason for the suggested overhaul.

>doubt you want one to really turn into a raven
Sadly, I couldn't find a way to overcome this at the time. I had to morph to get the unit to become ranged, and it insisted on using the "morphed" set of animations. Which is the Raven. :(

>there's more going down behind the scenes than I can see, Quest, item, chat, ability etc. systems that have great potential!
Yeah. Whilst that's the case, I haven't had the time to expose the potential of these things, except in minor detail by writing a couple of quests and spells. Which most people struggle to find anyway. :(
Thanks for all the feedback. I really appreciate it. Oddly enough, I didn't get this feedback until I actually linked here just to show a map that legitimately uses a high number of handles...

So um. The main problem I hit with this project was it got tedious to write all this stuff in WC3. Imagine writing systems like this AND writing the code that uses them. This was thousands and thousands of lines of JASS code, and each quest I wrote was another couple of hundred. Same goes for abilities, more or less, but for abilities I had to make a ton of objects as well.

However, everyone knows you do things better in coding the second time 'round. What would people think of creating a community project RPG? Fully open source, people can write components for it and I'd have them moderated and include the things which fit the map. It would use very similar systems to this map (which I'm thinking of releasing open-source anyway) except that different people could write different bits, so that there is an abundance of stuff in the map and everything is done by someone that is good at it (story writing in quests, terrain, abilities, systems, item balance, etc...).

Should we maybe consider doing this again? I'm not sure.

(+rep for the feedback.)
 

SerraAvenger

Cuz I can
Reaction score
234
>What would people think of creating a community project RPG?
if you can provide a version controller...

>each quest I wrote was another couple of hundred
Do you use structs and functions for quests?
Like,

function CreateQuest takes ...

function QuestAddRectEvent takes ...
function QuestAddTalkEvent takes ...

function QuestAddCondition takes ...
function QuestAddTalk takes ...

etc

Or even a script that creates all the text for you...
I use such stuff for my tooltips.
 

Jesus4Lyf

Good Idea™
Reaction score
397
>if you can provide a version controller...
I could do that.

>Do you use structs and functions for quests?
Sample: The Barky's Head quest. A fairly simple quest, requires 266 lines of code.
JASS:
library QuestKillDog uses QuestSystem, UnitDataSystem, Essential
    globals
        private trigger QResult
        private unitdata QGiver
        private integer QPlayer
        private unit DogOwner
        private unit Dog
        private trigger DogDies
        private timer BarkFollow
        private boolean Bark=false
        private dialogoption HesLoud
        private dialogoption PutDown
        private dialogoption YourDog
        private dialogoption KillDog
        private boolean Finished=false
        private itemdata DogHead
        private itemdata DogtoothGauntlets
    endglobals
    
    private function DDogRumour takes nothing returns boolean
        local unitdata d=GetUnitUserData(DialogTarget[ClickingPlayer])
        call OutputDialog(ClickingPlayer,&quot;I heard &quot;+GetUnitName(DogOwner))
        call OutputDialog(ClickingPlayer,&quot;got a dog named Barky.&quot;)
        call OutputDialog(ClickingPlayer,&quot;Kind of loud. And annoying.&quot;)
		call OutputDialog(ClickingPlayer,&quot; &quot;)
		call RefreshDialog()
        return false
    endfunction
    
    private function DDeadDogRumour takes nothing returns boolean
        local unitdata d=GetUnitUserData(DialogTarget[ClickingPlayer])
        if d.u==DogOwner then
            if ClickingPlayer==QPlayer then
                call OutputDialog(ClickingPlayer,&quot;Please don&#039;t talk to me.&quot;)
                call OutputDialog(ClickingPlayer,&quot;I know you killed Barky.&quot;)
                call d.moddisptoplayer(ClickingPlayer,-1)
            else
                call OutputDialog(ClickingPlayer,GetPlayerName(Player(QPlayer))+&quot; killed my&quot;)
                call OutputDialog(ClickingPlayer,&quot;dog. Honestly, I&#039;d love it&quot;)
                call OutputDialog(ClickingPlayer,&quot;if someone did the same to&quot;)
                call OutputDialog(ClickingPlayer,&quot;him.&quot;)
            endif
        else
            if ClickingPlayer==QPlayer then
                call OutputDialog(ClickingPlayer,&quot;Word on the streets is you&quot;)
            else
                call OutputDialog(ClickingPlayer,&quot;Apparently, &quot;+GetPlayerName(Player(QPlayer)))
            endif
            call OutputDialog(ClickingPlayer,&quot;killed &quot;+GetUnitName(DogOwner)+&quot;&#039;s&quot;)
            call OutputDialog(ClickingPlayer,&quot;dog, Barky. Kind of mean...&quot;)
            call OutputDialog(ClickingPlayer,&quot;Don&#039;t you think? I bet that&quot;)
            call OutputDialog(ClickingPlayer,GetUnitName(DogOwner)+&quot; is upset.&quot;)
        endif
        call OutputDialog(ClickingPlayer,&quot; &quot;)
		call RefreshDialog()
        return false
    endfunction
    
    private function DogDead takes nothing returns nothing
        local unitdata d=GetUnitUserData(DogOwner)
        call PauseTimer(BarkFollow)
        set BarkFollow=null
        call DestroyTrigger(DogDies)
        set DogDies=null
        call d.removeoption(PutDown)
        call d.removeoption(HesLoud)
        call SetLatestRumour(function DDeadDogRumour)
        call CompassTarget[QPlayer].settargetunit(QGiver.u)
    endfunction
    
    private function DDogOwnerTalkHesLoud takes nothing returns boolean
        local unitdata d=GetUnitUserData(DialogTarget[ClickingPlayer])
        if d.getdisptoplayer(ClickingPlayer)&gt;17 then
            call OutputDialog(ClickingPlayer,&quot;I suppose you&#039;re right. Bye&quot;)
            call OutputDialog(ClickingPlayer,&quot;bye, Barky... Poor dog.&quot;)
            call DogDead()
            call RefreshDialogInput(ClickingPlayer)
            call KillUnit(Dog)
            call RemoveUnit(Dog)
        else
            call OutputDialog(ClickingPlayer,&quot;That&#039;s no excuse. I still&quot;)
            call OutputDialog(ClickingPlayer,&quot;love my dog. I don&#039;t think&quot;)
            call OutputDialog(ClickingPlayer,&quot;you&#039;d do that...&quot;)
        endif
		call OutputDialog(ClickingPlayer,&quot; &quot;)
		call RefreshDialog()
        return false
    endfunction
    
    private function DDogOwnerTalkPutDown takes nothing returns boolean
        local unitdata d=GetUnitUserData(DialogTarget[ClickingPlayer])
        call OutputDialog(ClickingPlayer,&quot;What? Put Barky down? You&#039;re&quot;)
        call OutputDialog(ClickingPlayer,&quot;terrible! Why on earth would&quot;)
        call OutputDialog(ClickingPlayer,&quot;I want to kill Barky?&quot;)
        if ClickingPlayer==QPlayer then
            call d.addaudience(HesLoud,ClickingPlayer)
            call RefreshDialogInput(ClickingPlayer)
        endif
        call d.moddisptoplayer(ClickingPlayer,-1)
        call OutputDialog(ClickingPlayer,&quot; &quot;)
		call RefreshDialog()
        return false
    endfunction
    
    private function DDogOwnerTalkYourDog takes nothing returns boolean
        local unitdata d=GetUnitUserData(DialogTarget[ClickingPlayer])
        if GetWidgetLife(Dog)&lt;0.405 then
            if ClickingPlayer==QPlayer then
                call OutputDialog(ClickingPlayer,&quot;Barky? Baaarrrky... Where are&quot;)
                call OutputDialog(ClickingPlayer,&quot;you, barky?&quot;)
            else
                call OutputDialog(ClickingPlayer,&quot;Barky? Baaarrrky... Where are&quot;)
                call OutputDialog(ClickingPlayer,&quot;you, barky?&quot;)
            endif
		else
            call OutputDialog(ClickingPlayer,&quot;I love my dog. He&#039;s kind of&quot;)
            call OutputDialog(ClickingPlayer,&quot;loud, though. That&#039;s why I&quot;)
            call OutputDialog(ClickingPlayer,&quot;call him Barky!&quot;)
            call d.addaudience(PutDown,ClickingPlayer)
            call RefreshDialogInput(ClickingPlayer)
		endif
		call OutputDialog(ClickingPlayer,&quot; &quot;)
		call RefreshDialog()
        return false
    endfunction
    
    private function DGiverTalkKillDog takes nothing returns boolean
        local unitdata d=GetUnitUserData(DialogTarget[ClickingPlayer])
        if Dog==null or GetWidgetLife(Dog)&lt;0.405 then
            set Dog=null
            if Inventory[ClickingPlayer].hasitem(DogHead) then
                call OutputDialog(ClickingPlayer,&quot;Hey, it&#039;s that dog&#039;s head!&quot;)
                call OutputDialog(ClickingPlayer,&quot;* &quot;+GetUnitName(d.u)+&quot; suddenly&quot;)
                call OutputDialog(ClickingPlayer,&quot;* rips Barky&#039;s jaw open,&quot;)
                call OutputDialog(ClickingPlayer,&quot;* removes his teeth, and&quot;)
                call OutputDialog(ClickingPlayer,&quot;* attaches them to a pair of&quot;)
                call OutputDialog(ClickingPlayer,&quot;* gloves. These he gives the&quot;)
                call OutputDialog(ClickingPlayer,&quot;* gloves to you with a grin.&quot;)
                call OutputDialog(ClickingPlayer,&quot;The head&#039;s mine, though.&quot;)
                call Inventory[ClickingPlayer].removeitem(DogHead,true)
                call Inventory[ClickingPlayer].additem(DogtoothGauntlets)
            endif
            call OutputDialog(ClickingPlayer,&quot;Thank you for taking care of&quot;)
            call OutputDialog(ClickingPlayer,&quot;that dog. &quot;+GetUnitName(DogOwner))
            call OutputDialog(ClickingPlayer,&quot;deserved it for picking him.&quot;)
            if not Finished then
                set Finished=true
                call d.moddisptoplayer(ClickingPlayer,2)
                call TriggerEvaluate(QResult)
                set QResult=null
            endif
		else
            call OutputDialog(ClickingPlayer,&quot;Well? I hear barking! Go fix&quot;)
            call OutputDialog(ClickingPlayer,GetUnitName(DogOwner)+&quot;&#039;s dog!&quot;)
		endif
		call OutputDialog(ClickingPlayer,&quot; &quot;)
		call RefreshDialog()
        return false
    endfunction
    
    private function DoBarkFollow takes nothing returns nothing
        if GetWidgetLife(Dog)&lt;0.405 then
            call CreateItem(&#039;I005&#039;,GetUnitX(Dog),GetUnitY(Dog))
            call GetUnitData(DogOwner).moddisptoplayer(QPlayer,-7)
            call DogDead()
            return
        endif
        if Bark then
            call StartSound(gg_snd_DogBark1)
        else
            call StartSound(gg_snd_DogBark2)
        endif
        if GetWidgetLife(DogOwner)&lt;0.405 then
            if GetUnitAbilityLevel(Dog,&#039;Awan&#039;)&lt;1 then
                call UnitAddAbility(Dog,&#039;Awan&#039;)
            endif
        else
            if DistanceBetweenUnits(Dog,DogOwner)&gt;700 then
                call SetUnitX(Dog,GetUnitX(DogOwner))
                call SetUnitY(Dog,GetUnitY(DogOwner))
            endif
            call IssueTargetOrder(Dog,&quot;move&quot;,DogOwner)
        endif
        set Bark=not Bark
    endfunction
    
    private function DogDeath takes nothing returns boolean
        call CreateItem(DogHead.type,GetUnitX(Dog),GetUnitY(Dog))
        call GetUnitData(DogOwner).moddisptoplayer(GetPlayerId(GetOwningPlayer(GetKillingUnit())),-7)
        call DogDead()
        return false
    endfunction
    
    private function Starter takes nothing returns boolean
        local unitdata d
        local group g=CreateGroup()
        set QResult=QuestResult
		set QGiver=QuestGiver
        set QPlayer=QuestPlayer
        // Assign dog owner
        call GroupEnumUnitsOfPlayer(g,Player(12),NPCfilter)
        loop
            set DogOwner=GetRandomUnit(g)
            exitwhen DogOwner!=QGiver.u
        endloop
        // Configure dog
        set Dog=CreateUnit(Player(12),&#039;q000&#039;,GetUnitX(DogOwner),GetUnitY(DogOwner),0)
        call AttachSoundToUnit(gg_snd_DogBark1,Dog)
        call AttachSoundToUnit(gg_snd_DogBark2,Dog)
        call SetSoundVolume(gg_snd_DogBark1,127)
        call SetSoundVolume(gg_snd_DogBark2,127)
        call SetUnitMoveSpeed(Dog,GetUnitMoveSpeed(DogOwner)-5)
        set BarkFollow=CreateTimer()
		call TimerStart(BarkFollow,3,true,function DoBarkFollow)
        set DogDies=CreateTrigger()
        call TriggerAddCondition(DogDies,Condition(function DogDeath))
        call TriggerRegisterUnitEvent(DogDies,Dog,EVENT_UNIT_DEATH)
        call CompassTarget[QPlayer].settargetunit(Dog)
        // Latest Rumour
        call SetLatestRumour(function DDogRumour)
        // Talk about quest
        call GetUnitData(DogOwner).addaudience(YourDog,QPlayer)
        call QGiver.addaudience(KillDog,QPlayer)
        call RefreshDialogInput(QPlayer)
        call OutputDialog(QPlayer,&quot;I have a dire situation. I&quot;)
        call OutputDialog(QPlayer,&quot;can&#039;t sleep. I can&#039;t think. I&quot;)
        call OutputDialog(QPlayer,&quot;can&#039;t take it. I need you to&quot;)
        call OutputDialog(QPlayer,&quot;kill &quot;+GetUnitName(DogOwner)+&quot;&#039;s&quot;)
        call OutputDialog(QPlayer,&quot;dog, so that it will SHUT UP!&quot;)
		call OutputDialog(QPlayer,&quot; &quot;)
		call RefreshDialog()
        call DestroyTrigger(GetTriggeringTrigger())
		return false
    endfunction
    
    private function UseDogHead takes nothing returns boolean
        if Bark then
            call AttachSoundToUnit(gg_snd_DogBark1,GetSpellAbilityUnit())
            call SetSoundVolume(gg_snd_DogBark1,127)
            call StartSound(gg_snd_DogBark1)
        else
            call AttachSoundToUnit(gg_snd_DogBark2,GetSpellAbilityUnit())
            call SetSoundVolume(gg_snd_DogBark2,127)
            call StartSound(gg_snd_DogBark2)
        endif
        set Bark=not Bark
        return false
    endfunction
    
    function InitQuestKillDog takes nothing returns nothing
        local equipmentdata e
        call mission.new(function Starter).register(0,1) // Trigger, faction, level
        // Dialog options
        set HesLoud=dialogoption.new(&quot;He&#039;s too loud&quot;,function DDogOwnerTalkHesLoud)
        set PutDown=dialogoption.new(&quot;Put him down&quot;,function DDogOwnerTalkPutDown)
        set YourDog=dialogoption.new(&quot;Your dog&quot;,function DDogOwnerTalkYourDog)
        set KillDog=dialogoption.new(&quot;Kill the dog&quot;,function DGiverTalkKillDog)
        // Items
        set DogtoothGauntlets=itemdata.register(&#039;I005&#039;,&#039;A003&#039;,&#039;A004&#039;,1,function WieldGauntlets,function Unwield)
        set DogHead=itemdata.register(&#039;I006&#039;,&#039;A005&#039;,&#039;A006&#039;,3,function UseDogHead,null)
        set e=equipmentdata.new(DogtoothGauntlets)
        call e.addbonus(&#039;A01E&#039;) // +15% attack speed
        call e.addbonus(&#039;A01F&#039;) // +12 damage
        call e.addbonus(&#039;A01G&#039;) // +1 armour
    endfunction
endlibrary
>Or even a script that creates all the text for you...
You mean like a precompiler? That sounds nicer than typing it out... XD
 

SerraAvenger

Cuz I can
Reaction score
234
I mean a script that will change
ShowText( "Ostentatiously, thou hast killed the most beloved dog under the thausand suns. For that you'll gonna die!" )
->
Code:
            call OutputDialog(ClickingPlayer,"Ostentatiously, thou hast killed")
            call OutputDialog(ClickingPlayer,"the most beloved dog under the")
            call OutputDialog(ClickingPlayer,"thausand suns. For that")
            call OutputDialog(ClickingPlayer, "you'll gonna die!")
 

Jesus4Lyf

Good Idea™
Reaction score
397
>I actually have plans to redo it completely. Instead of using text tags (which have that darn shadow effect) I could use screen messages in the same way.

That would accomplish that. :)

-->
call OutputDialog( ClickingPlayer, "Ostentatiously, thou hast killed the most beloved dog under the thausand suns. For that you'll gonna die!" )

Nice writing, by the way. ;)

If we launch some kind of community based project, I'd redo all the systems anyway. I wrote most of them as if I'd be the only person using them...
 

Jesus4Lyf

Good Idea™
Reaction score
397
After a year or more of working on this, and about 8 versions, I guess I lost interest. Attached in this post is the latest version, with the one H2I func it had (handle counter) updated. Magically works on 1.24c. ;)

Anyway, I think I added another quest. This map demonstrates the inventory system I hope to make, so hence the update. Cheers. :thup:

Edit: Oh screw it. Here's the map unprotected.
I learned a frakton writing this project. I learned what a pain an unintuitive interface is to code with. I learned that encapsulation matters for maintainability. I learned that writing 7 pieces of object editor data for each ability will kill a map. I learned that a good inventory system could be designed which really works. I learned that no matter how you try, if you try to make something too big in WC3 even without any code firing, it will desynch. I learned that mapping takes way too long to achieve too little when you make it too much effort.

Don't use the code in that map. KTA is like a very devolved form of T32, so don't think its some great new thing or something (despite its name). This map was written before all my systems were released, except KT1/KT2 and I think that's it. The code in the map is fairly efficiency, but needs work in general.

You'll quickly see what inspired T32, AIDS, and all the other stuff I've been writing. It's my long trip back to mapping after being put off by such a crappy project. I gained a great awareness of what is required to make mapping flexible and fast. :)

PS. Note that this was written a long time ago, now. I have a very different coding style these days. It's more... sane. ;)
 

Attachments

  • Savage Creed ALPHA 0.87.w3x
    246.3 KB · Views: 272
  • Savage Creed ALPHA 0.87 unprotected.w3x
    433.5 KB · Views: 283
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top