From The Mana World
m (Gumi moved page User:Meko/Tiled/NPC Proposal to User:Gumi/Tiled/NPC Proposal: Automatically moved page while renaming the user "Meko" to "Gumi")
 
(20 intermediate revisions by the same user not shown)
Line 3: Line 3:


= Usage =
= Usage =
For the examples below we will use the map 009-1 and position 25, 25. The only mandatory property to make a npc is "callfunc". To make a store, put "shop" instead of "callfunc".
For the examples below we will use the map 009-1 and position 25, 25. The only mandatory property to make a npc is "callfunc". To make a store, put "items" instead of "callfunc".
<br>
<br>
== Shop npc [RC] ==
== Shop npc [RC] ==
Line 26: Line 26:
<br>
<br>


== Anonymous npc ==
== Semi-anonymous npc ==
if you do not care what name your npc has you can set its name to # to get an auto-generated name. This is particularly useful for npcs that only activate when you walk over them.
When you have multiple copies of a npc with the same name, you can add '''#''' at the end '''without anything else''' to append an auto-generated suffix. For example, the barrels would become barrel# instead of barrel#(number). This way you do not have to worry about giving a safe name to a npc.
This also works for npcs starting and ending with # like #Knockback#.
<br><br>
<br><br>
Object type: npc<br>
Object type: npc<br>
Object name: '''#'''
Object name: FooBar'''#'''
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 41: Line 42:


Gives in Hercules: <pre>
Gives in Hercules: <pre>
009-1,25,25,0    script    #009-1_anon0   32767,{
009-1,25,25,0    script    FooBar#009-1_0   32767,{
     callfunc "Qux", "", 25, 25;
     callfunc "Qux";
     end;
     end;
}
}
Line 48: Line 49:
<br>
<br>
Gives in TMWA: <pre>
Gives in TMWA: <pre>
009-1,25,25,0|script|#009-1_anon0|32767
009-1,25,25,0|script|FooBar#009-1_0|32767
{
{
    set @npcname$, "";
    setarray @npcloc, 25, 25;
     callfunc "Qux";
     callfunc "Qux";
     end;
     end;
Line 57: Line 56:
</pre>
</pre>
<br>
<br>
'''''@wushin: it's up to you to decide the naming convention of anonymous npcs'''''
<br><br>


== Semi-anonymous npc ==
== Named npc ==
When you have multiple copies of a npc with the same name, you can add '''#''' at the end '''without anything else''' to append an auto-generated suffix. For example, the barrels would become barrel# instead of barrel#(number). This way you do not have to worry about giving a safe name to a npc.
<br><br>
Object type: npc<br>
Object type: npc<br>
Object name: FooBar'''#'''
Object name: FooBar
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 74: Line 69:
|}
|}


Gives: <pre>
Gives in Hercules: <pre>
009-1,25,25,0|script|FooBar#009-1_0|32767
009-1,25,25,0   script   FooBar   32767,{
{
     callfunc "Qux";
     callfunc "Qux", "FooBar", 25, 25;
     end;
     end;
}
}
</pre>
</pre>
<br>
<br>
 
Gives in TMWA: <pre>
== Named npc ==
009-1,25,25,0|script|FooBar|32767
Object type: npc<br>
Object name: FooBar#Baz
{| class="wikitable" border="1"
|-
! Property
! Value
|-
| callfunc
| Qux
|}
 
Gives: <pre>
009-1,25,25,0|script|FooBar#Baz|32767
{
{
     callfunc "Qux", "FooBar", 25, 25;
     callfunc "Qux";
     end;
     end;
}
}
Line 108: Line 89:
== Adding a sprite ==
== Adding a sprite ==
Object type: npc<br>
Object type: npc<br>
Object name: FooBar#Baz
Object name: #
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 121: Line 102:
|}
|}


Gives: <pre>
Gives in Hercules: <pre>
009-1,25,25,0|script|FooBar#Baz|161
009-1,25,25,0    script    #009-1_anon0    161,{
    callfunc "Qux";
    end;
}
</pre>
<br>
Gives in TMWA: <pre>
009-1,25,25,0|script|#009-1_anon0|161
{
{
     callfunc "Qux", "FooBar", 25, 25;
     callfunc "Qux";
     end;
     end;
}
}
Line 149: Line 137:
|}
|}


Gives: <pre>
Gives in Hercules: <pre>
009-1,25,25,3    script    FooBar#Baz    161,{
    callfunc "Qux";
    end;
}
</pre>
<br>
Gives in TMWA: <pre>
009-1,25,25,3|script|FooBar#Baz|161
009-1,25,25,3|script|FooBar#Baz|161
{
{
     callfunc "Qux", "FooBar", 25, 25;
     callfunc "Qux";
     end;
     end;
}
}
Line 177: Line 172:
|}
|}


Gives: <pre>
Gives in Hercules: <pre>
009-1,25,25,3    script    FooBar#Baz    161,{
    callfunc "Qux";
    end;
OnInit:
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}
</pre>
<br>
Gives in TMWA: <pre>
009-1,25,25,3|script|FooBar#Baz|161
009-1,25,25,3|script|FooBar#Baz|161
{
{
     callfunc "Qux", "FooBar", 25, 25;
     callfunc "Qux";
     end;
     end;
OnInit:
OnInit:
Line 194: Line 200:
Object name: FooBar#Baz<br>
Object name: FooBar#Baz<br>
Rotation: 90
Rotation: 90
Use tiled to mark the area of the trigger. A collapsed point in the upper left corner denotes a 0,0 trigger.
<br><br>
Use tiled to mark the area of the trigger. To have a 0,0 trigger '''set the "trigger" property to "true"'''.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 200: Line 207:
! Property
! Property
! Value
! Value
|-
| trigger
| '''true'''
|-
|-
| debug
| debug
Line 214: Line 218:
|}
|}


Gives: <pre>
Gives in Hercules: <pre>
009-1,25,25,3    script    FooBar#Baz    161,2,4,{
    end;
OnTouch:
    callfunc "Qux";
    end;
OnInit:
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}
</pre>
<br>
Gives in TMWA: <pre>
009-1,25,25,3|script|FooBar#Baz|161,2,4
009-1,25,25,3|script|FooBar#Baz|161,2,4
{
{
     end;
     end;
OnTouch:
OnTouch;
     callfunc "Qux", "FooBar", 25, 25;
     callfunc "Qux";
     end;
     end;
OnInit:
OnInit:
Line 255: Line 272:


Gives: <pre>
Gives: <pre>
009-1,25,25,3    script    FooBar#Baz    161,2,4,{
    end;
OnTouch:
    callfunc "Qux";
    end;
OnTimer10000:
    callfunc "Function";
    initnpctimer;
    end;
OnInit:
    if(DEBUG >= 2) end;
    initnpctimer;
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}
</pre>
<br>
Gives in TMWA: <pre>
009-1,25,25,3|script|FooBar#Baz|161,2,4
009-1,25,25,3|script|FooBar#Baz|161,2,4
{
{
     end;
     end;
OnTouch:
OnTouch:
     callfunc "Qux", "FooBar", 25, 25;
     callfunc "Qux";
     end;
     end;
OnTimer10000:
OnTimer10000:
     callfunc "Function", "FooBar", 25, 25;
     callfunc "Function";
     initnpctimer;
     initnpctimer;
     end;
     end;
Line 275: Line 311:
<br>
<br>


== Passing arguments to the function ==
== Passing arguments to the function (Hercules only) ==
Object type: npc<br>
Object type: npc<br>
Object name: FooBar#Baz<br>
Object name: FooBar#Baz<br>
Line 303: Line 339:
|}
|}


Gives: <pre>
Gives in Hercules: <pre>
009-1,25,25,3|script|FooBar#Baz|161,2,4
009-1,25,25,3   script   FooBar#Baz   161,2,4,{
{
     end;
     end;
OnTouch:
OnTouch:
     callfunc "Qux", "FooBar", 25, 25, 19, "ba,z";
     callfunc "Qux", 19, "ba,z";
     end;
     end;
OnTimer10000:
OnTimer10000:
     callfunc "Function", "FooBar", 25, 25;
     callfunc "Function";
     initnpctimer;
     initnpctimer;
     end;
     end;
Line 322: Line 357:
}
}
</pre>
</pre>
<br><br>


=== Automatically added properties ===
== Adding custom variables (TMWA only) ==
For TMWA, any property that starts with @ is interpreted as a custom variable.
<br><br>
Object type: npc<br>
Object name: FooBar#Baz<br>
Rotation: 90
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 329: Line 371:
! Value
! Value
|-
|-
| name
| @integer
| Anything that comes before the # (if any) in the object name
| '''19'''
|-
|-
| X
| @string$
| the X location of the npc
| '''ba,z'''
|-
|-
| Y
| interval
| the Y location of the npc
| 10000,Function
|}
Any custom property is added after the default properties
<br><br>
 
= Examples =
== Debug npc ==
Object type: npc<br>
Object name: Debug#3
{| class="wikitable" border="1"
|-
|-
! Property
| trigger
! Value
| 2,4
|-
| sprite
| 154
|-
|-
| debug
| debug
| true
| true
|-
| sprite
| 161
|-
|-
| callfunc
| callfunc
| Debug
| Qux
|}
|}


Gives: <pre>
Gives in TMWA: <pre>
020-1,75,85,0|script|Debug#3|154
009-1,25,25,3|script|FooBar#Baz|161,2,4
{
{
     callfunc "Debug";
    end;
OnTouch:
    set @integer, 19;
    set @string$, "ba,z";
    callfunc "Qux";
    end;
OnTimer10000:
     callfunc "Function";
    initnpctimer;
     end;
     end;
OnInit:
OnInit:
    if(DEBUG >= 2) end;
    initnpctimer;
     if(DEBUG) end;
     if(DEBUG) end;
     disablenpc "Debug#3", "Debug", 75, 85;
     disablenpc "FooBar#Baz";
    end;
}
</pre>
<br>
 
== Banker ==
Object type: npc<br>
Object name: Richard
{| class="wikitable" border="1"
|-
! Property
! Value
|-
| sprite
| 161
|-
| callfunc
| Banker
|}
 
Gives: <pre>
009-2,20,99,0|script|Richard|161
{
    callfunc "Banker", "Richard", 20, 99;
     end;
     end;
}
}
</pre>
</pre>
<br>
<br>
[[Category:Development]]

Latest revision as of 19:42, 15 June 2020

This proposal is to enable npc creation from Tiled. It could even provide a way to add a "npc finder" to manaplus so that players can easily know where a npc is (manaplus would simply have to look at the tmx). Should not be used for floating npcs (no map).

Usage

For the examples below we will use the map 009-1 and position 25, 25. The only mandatory property to make a npc is "callfunc". To make a store, put "items" instead of "callfunc".

Shop npc [RC]

Object type: shop
Object name: FooBar#Baz

Property Value
items Item,Item:*2,Item,Item:9

Gives in Hercules:

009-1,25,25,0    shop    FooBar#Baz    32767,Item:*1,Item:*2,Item:*1,Item:9


Gives in TMWA:

009-1,25,25,0|shop|FooBar#Baz|32767,Item:*1,Item:*2,Item:*1,Item:9


Semi-anonymous npc

When you have multiple copies of a npc with the same name, you can add # at the end without anything else to append an auto-generated suffix. For example, the barrels would become barrel# instead of barrel#(number). This way you do not have to worry about giving a safe name to a npc. This also works for npcs starting and ending with # like #Knockback#.

Object type: npc
Object name: FooBar#

Property Value
callfunc Qux

Gives in Hercules:

009-1,25,25,0    script    FooBar#009-1_0    32767,{
    callfunc "Qux";
    end;
}


Gives in TMWA:

009-1,25,25,0|script|FooBar#009-1_0|32767
{
    callfunc "Qux";
    end;
}


Named npc

Object type: npc
Object name: FooBar

Property Value
callfunc Qux

Gives in Hercules:

009-1,25,25,0    script    FooBar    32767,{
    callfunc "Qux";
    end;
}


Gives in TMWA:

009-1,25,25,0|script|FooBar|32767
{
    callfunc "Qux";
    end;
}

That's nice but this npc is not sent to the client since its ID is 32767. Let's add a sprite.

@wushin: There is a "end;" instead of a "close;" because not all function send "mes" so "close2;" should be put before "return;" in the functions

Adding a sprite

Object type: npc
Object name: #

Property Value
sprite 161
callfunc Qux

Gives in Hercules:

009-1,25,25,0    script    #009-1_anon0    161,{
    callfunc "Qux";
    end;
}


Gives in TMWA:

009-1,25,25,0|script|#009-1_anon0|161
{
    callfunc "Qux";
    end;
}

The "sprite" property is non-mandatory and defaults to 32767 when not set.

Setting the direction

Tiled has a built-in "Rotation" property for objects. To set the direction, set the rotation to any multiple of 90 (or a multiple of 45 if your npc supports all 8 directions). The minimum is -180 and the maximum is 180. For example, 90 is facing west and 180 (or -180) is facing north.

Object type: npc
Object name: FooBar#Baz
Rotation: 90

Property Value
sprite 161
callfunc Qux

Gives in Hercules:

009-1,25,25,3    script    FooBar#Baz    161,{
    callfunc "Qux";
    end;
}


Gives in TMWA:

009-1,25,25,3|script|FooBar#Baz|161
{
    callfunc "Qux";
    end;
}


Setting as debug npc

Object type: npc
Object name: FooBar#Baz
Rotation: 90

Property Value
debug true
sprite 161
callfunc Qux

Gives in Hercules:

009-1,25,25,3    script    FooBar#Baz    161,{
    callfunc "Qux";
    end;
OnInit:
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}


Gives in TMWA:

009-1,25,25,3|script|FooBar#Baz|161
{
    callfunc "Qux";
    end;
OnInit:
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}


Adding a trigger area

Object type: npc
Object name: FooBar#Baz
Rotation: 90

Use tiled to mark the area of the trigger. To have a 0,0 trigger set the "trigger" property to "true".

Property Value
debug true
sprite 161
callfunc Qux

Gives in Hercules:

009-1,25,25,3    script    FooBar#Baz    161,2,4,{
    end;
OnTouch:
    callfunc "Qux";
    end;
OnInit:
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}


Gives in TMWA:

009-1,25,25,3|script|FooBar#Baz|161,2,4
{
    end;
OnTouch;
    callfunc "Qux";
    end;
OnInit:
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}


Adding a recurring timer

Object type: npc
Object name: FooBar#Baz
Rotation: 90

Property Value
interval 10000,Function
trigger 2,4
debug true
sprite 161
callfunc Qux

Gives:

009-1,25,25,3    script    FooBar#Baz    161,2,4,{
    end;
OnTouch:
    callfunc "Qux";
    end;
OnTimer10000:
    callfunc "Function";
    initnpctimer;
    end;
OnInit:
    if(DEBUG >= 2) end;
    initnpctimer;
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}


Gives in TMWA:

009-1,25,25,3|script|FooBar#Baz|161,2,4
{
    end;
OnTouch:
    callfunc "Qux";
    end;
OnTimer10000:
    callfunc "Function";
    initnpctimer;
    end;
OnInit:
    if(DEBUG >= 2) end;
    initnpctimer;
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}


Passing arguments to the function (Hercules only)

Object type: npc
Object name: FooBar#Baz
Rotation: 90

Property Value
arguments 19,"ba,z"
interval 10000,Function
trigger 2,4
debug true
sprite 161
callfunc Qux

Gives in Hercules:

009-1,25,25,3    script    FooBar#Baz    161,2,4,{
    end;
OnTouch:
    callfunc "Qux", 19, "ba,z";
    end;
OnTimer10000:
    callfunc "Function";
    initnpctimer;
    end;
OnInit:
    if(DEBUG >= 2) end;
    initnpctimer;
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}




Adding custom variables (TMWA only)

For TMWA, any property that starts with @ is interpreted as a custom variable.

Object type: npc
Object name: FooBar#Baz
Rotation: 90

Property Value
@integer 19
@string$ ba,z
interval 10000,Function
trigger 2,4
debug true
sprite 161
callfunc Qux

Gives in TMWA:

009-1,25,25,3|script|FooBar#Baz|161,2,4
{
    end;
OnTouch:
    set @integer, 19;
    set @string$, "ba,z";
    callfunc "Qux";
    end;
OnTimer10000:
    callfunc "Function";
    initnpctimer;
    end;
OnInit:
    if(DEBUG >= 2) end;
    initnpctimer;
    if(DEBUG) end;
    disablenpc "FooBar#Baz";
    end;
}