<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://chronocrash.com/openbor/wiki/index.php?action=history&amp;feed=atom&amp;title=Animationscript</id>
	<title>Animationscript - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://chronocrash.com/openbor/wiki/index.php?action=history&amp;feed=atom&amp;title=Animationscript"/>
	<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;action=history"/>
	<updated>2026-09-03T16:37:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=904&amp;oldid=prev</id>
		<title>Dcurrent at 23:25, 17 August 2026</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=904&amp;oldid=prev"/>
		<updated>2026-08-17T23:25:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:25, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l375&quot;&gt;Line 375:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 375:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Thinkscript]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Thinkscript]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Ondrawscript]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Ondrawscript]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Openbor]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Model]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Model]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Script]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Script]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Animation]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Animation]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Script Events]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Script Events]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:OpenBOR Index]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=894&amp;oldid=prev</id>
		<title>Dcurrent at 22:54, 17 August 2026</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=894&amp;oldid=prev"/>
		<updated>2026-08-17T22:54:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:54, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l377&quot;&gt;Line 377:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 377:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Openbor]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Openbor]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Animation]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Model]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Model]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Script]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Script]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Animation]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Script Events]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=893&amp;oldid=prev</id>
		<title>Dcurrent: /* Why No Frame Object? */</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=893&amp;oldid=prev"/>
		<updated>2026-08-17T22:53:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Why No Frame Object?&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:53, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the object-oriented convention of &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;representing every &lt;/del&gt;conceptual &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;frame &lt;/del&gt;as a discrete &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;object &lt;/del&gt;in favor of a data-oriented architecture. This is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the object-oriented convention of conceptual &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;frames &lt;/ins&gt;as a discrete &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;objects &lt;/ins&gt;in favor of a data-oriented architecture. This is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. Animation-frame data is sparse and highly heterogeneous, making a conventional fixed-layout frame representation potentially wasteful.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. Animation-frame data is sparse and highly heterogeneous, making a conventional fixed-layout frame representation potentially wasteful.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=892&amp;oldid=prev</id>
		<title>Dcurrent: /* Why No Frame Object? */</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=892&amp;oldid=prev"/>
		<updated>2026-08-17T22:51:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Why No Frame Object?&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:51, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the object-oriented convention of representing every conceptual frame as a discrete object in favor of data-oriented architecture. This &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;design &lt;/del&gt;is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the object-oriented convention of representing every conceptual frame as a discrete object in favor of &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;a &lt;/ins&gt;data-oriented architecture. This is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Most &lt;/del&gt;frame &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;properties are unused at any given position. Multiplying &lt;/del&gt;a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;complete frame object across properties, &lt;/del&gt;frame &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;positions, animations, and models would compound memory storage and retrieval costs on several levels. The resulting overhead could become substantial even on contemporary hardware&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Animation-&lt;/ins&gt;frame &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;data is sparse and highly heterogeneous, making &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;conventional fixed-layout &lt;/ins&gt;frame &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;representation potentially wasteful&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR instead keeps frame-specific data as arrayed members of the owning animation, keyed by a shared frame-position index. This &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;arrangement &lt;/del&gt;avoids a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;monolithic object &lt;/del&gt;for every conceptual frame while retaining direct access to the properties that actually define each indexed position.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR instead keeps frame-specific data as arrayed members of the owning animation, keyed by a shared frame-position index. This avoids &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;allocating &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;complete record &lt;/ins&gt;for every conceptual frame while retaining direct access to the properties that actually define each indexed position.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each animation owns parallel property arrays. Sprite, delay, movement, offset, collision, sound, draw method, vulnerability, and other frame-specific data use the same zero-based index across their respective arrays. The &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; local supplied to Animationscript is this shared &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;array &lt;/del&gt;index.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each animation owns parallel property arrays. Sprite, delay, movement, offset, collision, sound, draw method, vulnerability, and other frame-specific data use the same zero-based index across their respective arrays. The &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; local supplied to Animationscript is this shared &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;frame-position &lt;/ins&gt;index.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Animationscript is therefore best understood as code executed when an animation updates its current indexed position, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;not &lt;/del&gt;as a callback belonging to a separate frame object.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Animationscript is therefore best understood as code executed when an animation updates its current indexed position, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;rather than &lt;/ins&gt;as a callback belonging to a separate frame object.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Syntax ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Syntax ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=891&amp;oldid=prev</id>
		<title>Dcurrent: /* Why No Frame Object? */</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=891&amp;oldid=prev"/>
		<updated>2026-08-17T22:43:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Why No Frame Object?&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:43, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the object-oriented convention of representing every conceptual frame as a discrete object. This design is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the object-oriented convention of representing every conceptual frame as a discrete object &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;in favor of data-oriented architecture&lt;/ins&gt;. This design is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. Most frame properties are unused at any given position. Multiplying a complete frame object across properties, frame positions, animations, and models would compound memory storage and retrieval costs on several levels. The resulting overhead could become substantial even on contemporary hardware.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. Most frame properties are unused at any given position. Multiplying a complete frame object across properties, frame positions, animations, and models would compound memory storage and retrieval costs on several levels. The resulting overhead could become substantial even on contemporary hardware.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=890&amp;oldid=prev</id>
		<title>Dcurrent: /* Why No Frame Object? */</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=890&amp;oldid=prev"/>
		<updated>2026-08-17T22:27:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Why No Frame Object?&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:27, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;modern &lt;/del&gt;object-oriented convention of representing every conceptual frame as a discrete object. This design is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR deliberately eschews the object-oriented convention of representing every conceptual frame as a discrete object. This design is an engine-level optimization rather than a missing abstraction.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. Most frame properties are unused at any given position. Multiplying a complete frame object across properties, frame positions, animations, and models would compound memory storage and retrieval costs on several levels. The resulting overhead could become substantial even on contemporary hardware.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. Most frame properties are unused at any given position. Multiplying a complete frame object across properties, frame positions, animations, and models would compound memory storage and retrieval costs on several levels. The resulting overhead could become substantial even on contemporary hardware.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=889&amp;oldid=prev</id>
		<title>Dcurrent at 22:26, 17 August 2026</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=889&amp;oldid=prev"/>
		<updated>2026-08-17T22:26:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:26, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l7&quot;&gt;Line 7:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 7:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Frames and Animation Data ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Frames and Animation Data ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR uses the term &#039;&#039;frame&#039;&#039; for each indexed step presented to creators, and the model &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; command adds such a step to an animation. Internally, however, there is no standalone frame object containing a collection of properties.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenBOR uses the term &#039;&#039;frame&#039;&#039; for each indexed step presented to creators, and the model &amp;lt;code&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;frame&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&amp;lt;/code&amp;gt; command adds such a step to an &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Animation Overview|&lt;/ins&gt;animation&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;. Internally, however, there is no standalone frame object containing a collection of properties.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Why No Frame Object? ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=888&amp;oldid=prev</id>
		<title>Dcurrent: /* Model and Default-Model Execution */</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=888&amp;oldid=prev"/>
		<updated>2026-08-17T22:25:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Model and Default-Model Execution&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:25, 17 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l330&quot;&gt;Line 330:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 330:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This behavior is based on current and default model ownership, not on a special model name. Naming a model &amp;lt;code&amp;gt;global_model&amp;lt;/code&amp;gt; does not automatically invoke it for every entity. Shared helpers may instead be included in participating animation-script sources.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This behavior is based on current and default model ownership, not on a special model name. Naming a model &amp;lt;code&amp;gt;global_model&amp;lt;/code&amp;gt; does not automatically invoke it for every entity. Shared helpers may instead be included in participating animation-script sources.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Lifecycle functions such as &amp;lt;code&amp;gt;oncreate()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ondestroy()&amp;lt;/code&amp;gt;, when present, follow script-instance creation and destruction. They do not run on every animation frame update.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Lifecycle functions such as &amp;lt;code&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;oncreate()&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;ondestroy()&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&amp;lt;/code&amp;gt;, when present, follow script-instance creation and destruction. They do not run on every animation frame update.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Related Scripts ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Related Scripts ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
	<entry>
		<id>https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=887&amp;oldid=prev</id>
		<title>Dcurrent: Created page with &quot;&lt;code&gt;animationscript&lt;/code&gt; defines OpenBOR&#039;s animation-update script. The engine executes it whenever an animating entity enters or is moved to an indexed animation frame, including normal advancement, loop transitions, animation starts, and explicit frame updates.  The command name is technically exact - the compiled script belongs to the model&#039;s animation system and may service every animation in that model. Conceptually, its runtime role is a frame-update hook. It p...&quot;</title>
		<link rel="alternate" type="text/html" href="https://chronocrash.com/openbor/wiki/index.php?title=Animationscript&amp;diff=887&amp;oldid=prev"/>
		<updated>2026-08-17T22:18:25Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;code&amp;gt;animationscript&amp;lt;/code&amp;gt; defines OpenBOR&amp;#039;s animation-update script. The engine executes it whenever an animating entity enters or is moved to an indexed animation frame, including normal advancement, loop transitions, animation starts, and explicit frame updates.  The command name is technically exact - the compiled script belongs to the model&amp;#039;s animation system and may service every animation in that model. Conceptually, its runtime role is a frame-update hook. It p...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;code&amp;gt;animationscript&amp;lt;/code&amp;gt; defines OpenBOR&amp;#039;s animation-update script. The engine executes it whenever an animating entity enters or is moved to an indexed animation frame, including normal advancement, loop transitions, animation starts, and explicit frame updates.&lt;br /&gt;
&lt;br /&gt;
The command name is technically exact - the compiled script belongs to the model&amp;#039;s animation system and may service every animation in that model. Conceptually, its runtime role is a frame-update hook. It provides the current entity, animation, and frame index at the precise point where the indexed animation state changes.&lt;br /&gt;
&lt;br /&gt;
This placement makes Animationscript one of OpenBOR&amp;#039;s most flexible action-building tools. Creators may launch effects, branch attacks, coordinate linked entities, modify velocity, manage animation phases, create cancels, spawn projectiles, apply state changes, or replace native frame behavior before the engine finishes processing the new index.&lt;br /&gt;
&lt;br /&gt;
== Frames and Animation Data ==&lt;br /&gt;
&lt;br /&gt;
OpenBOR uses the term &amp;#039;&amp;#039;frame&amp;#039;&amp;#039; for each indexed step presented to creators, and the model &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; command adds such a step to an animation. Internally, however, there is no standalone frame object containing a collection of properties.&lt;br /&gt;
&lt;br /&gt;
=== Why No Frame Object? ===&lt;br /&gt;
&lt;br /&gt;
OpenBOR deliberately eschews the modern object-oriented convention of representing every conceptual frame as a discrete object. This design is an engine-level optimization rather than a missing abstraction.&lt;br /&gt;
&lt;br /&gt;
Each conceptual frame may comprise dozens of possible properties, while a single animation may contain dozens of frame positions and every loaded model may contain dozens of animations. Most frame properties are unused at any given position. Multiplying a complete frame object across properties, frame positions, animations, and models would compound memory storage and retrieval costs on several levels. The resulting overhead could become substantial even on contemporary hardware.&lt;br /&gt;
&lt;br /&gt;
OpenBOR instead keeps frame-specific data as arrayed members of the owning animation, keyed by a shared frame-position index. This arrangement avoids a monolithic object for every conceptual frame while retaining direct access to the properties that actually define each indexed position.&lt;br /&gt;
&lt;br /&gt;
Each animation owns parallel property arrays. Sprite, delay, movement, offset, collision, sound, draw method, vulnerability, and other frame-specific data use the same zero-based index across their respective arrays. The &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; local supplied to Animationscript is this shared array index.&lt;br /&gt;
&lt;br /&gt;
Animationscript is therefore best understood as code executed when an animation updates its current indexed position, not as a callback belonging to a separate frame object.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
animationscript {path}&lt;br /&gt;
&lt;br /&gt;
# Default&lt;br /&gt;
# No external animation-script source&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;{path}&amp;lt;/code&amp;gt; - Path to an OpenBOR Script source file containing animation helper functions, constants, and optional lifecycle functions.&lt;br /&gt;
* The command belongs in a model definition.&lt;br /&gt;
* The external source file does not define &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenBOR generates the Animationscript &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; function while loading the model.&lt;br /&gt;
* Model &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; content is merged into the generated entry point.&lt;br /&gt;
* The compiled script is shared by the model, while each entity supplies its own execution context and locals.&lt;br /&gt;
&lt;br /&gt;
Models may omit the &amp;lt;code&amp;gt;animationscript&amp;lt;/code&amp;gt; command when they only call built-in functions through &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; or use animation-level &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt;. OpenBOR still generates and compiles the required animation script from that model content.&lt;br /&gt;
&lt;br /&gt;
Example model header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
name example_character&lt;br /&gt;
type enemy&lt;br /&gt;
&lt;br /&gt;
animationscript data/scripts/example_animation.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
External source file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void set_animation_phase(int phase)&lt;br /&gt;
{&lt;br /&gt;
    void self = getlocalvar(&amp;quot;self&amp;quot;);&lt;br /&gt;
    setentityvar(self, &amp;quot;animation_phase&amp;quot;, phase);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clear_animation_phase()&lt;br /&gt;
{&lt;br /&gt;
    void self = getlocalvar(&amp;quot;self&amp;quot;);&lt;br /&gt;
    setentityvar(self, &amp;quot;animation_phase&amp;quot;, 0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file supplies callable functions, but no &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;. OpenBOR builds the entry point that calls these functions from the model&amp;#039;s animation instructions.&lt;br /&gt;
&lt;br /&gt;
Helper source may also be embedded directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
animationscript @script&lt;br /&gt;
void set_animation_phase(int phase)&lt;br /&gt;
{&lt;br /&gt;
    void self = getlocalvar(&amp;quot;self&amp;quot;);&lt;br /&gt;
    setentityvar(self, &amp;quot;animation_phase&amp;quot;, phase);&lt;br /&gt;
}&lt;br /&gt;
@end_script&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calling Functions with @cmd ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; converts a model instruction into a script function call tied to the immediately following frame command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
anim attack1&lt;br /&gt;
    @cmd set_animation_phase 1&lt;br /&gt;
    frame data/chars/example/attack_01.png&lt;br /&gt;
&lt;br /&gt;
    @cmd set_animation_phase 2&lt;br /&gt;
    frame data/chars/example/attack_02.png&lt;br /&gt;
&lt;br /&gt;
    @cmd clear_animation_phase&lt;br /&gt;
    frame data/chars/example/attack_03.png&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenBOR generates the frame-index checks and function calls during model loading. In this example, the phase values become &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; as the animation enters indexes &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Several &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; instructions may precede the same frame. Their calls execute in model-source order.&lt;br /&gt;
&lt;br /&gt;
Arguments are compiled as script expressions. Values may include integers, decimals, quoted strings, constants, &amp;lt;code&amp;gt;NULL()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getlocalvar(&amp;quot;self&amp;quot;)&amp;lt;/code&amp;gt;, or other expressions accepted by the script parser.&lt;br /&gt;
&lt;br /&gt;
== Inline @script ==&lt;br /&gt;
&lt;br /&gt;
Model &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; inserts code directly into the generated Animationscript entry point for the current animation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
anim walk&lt;br /&gt;
    @script&lt;br /&gt;
        void self = getlocalvar(&amp;quot;self&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if(frame == 0)&lt;br /&gt;
        {&lt;br /&gt;
            setentityvar(self, &amp;quot;walk_cycle&amp;quot;, 1);&lt;br /&gt;
        }&lt;br /&gt;
    @end_script&lt;br /&gt;
&lt;br /&gt;
    frame data/chars/example/walk_01.png&lt;br /&gt;
    frame data/chars/example/walk_02.png&lt;br /&gt;
    frame data/chars/example/walk_03.png&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unlike &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt;, placement of &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; beside a particular frame does not bind it to that frame. Inserted code is evaluated on every animation update within the containing animation. Use the automatically generated &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; variable when behavior should apply only to selected indexes.&lt;br /&gt;
&lt;br /&gt;
The generated entry point already declares &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;animhandle&amp;lt;/code&amp;gt;. Inline code may use those names directly. Retrieve &amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;animnum&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;getlocalvar()&amp;lt;/code&amp;gt; when needed.&lt;br /&gt;
&lt;br /&gt;
Functions cannot be declared inside a model &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; block because the block is inserted inside generated &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;. Place reusable function definitions in the external or header-level Animationscript source.&lt;br /&gt;
&lt;br /&gt;
== Generated Entry Point ==&lt;br /&gt;
&lt;br /&gt;
During model loading, OpenBOR performs the following work:&lt;br /&gt;
&lt;br /&gt;
# Reads the source supplied by &amp;lt;code&amp;gt;animationscript&amp;lt;/code&amp;gt;, when present.&lt;br /&gt;
# Collects animation-level &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; blocks.&lt;br /&gt;
# Converts each &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; instruction into a function call guarded by concrete animation and frame indexes.&lt;br /&gt;
# Generates &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; with local &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;animhandle&amp;lt;/code&amp;gt; variables.&lt;br /&gt;
# Merges generated animation routing into the helper source.&lt;br /&gt;
# Compiles the completed script once for the model.&lt;br /&gt;
&lt;br /&gt;
Creators should not supply their own &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;. The engine-owned entry point is what connects model animation data, &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt;, and runtime frame updates.&lt;br /&gt;
&lt;br /&gt;
Generated source for animation commands is written to &amp;lt;code&amp;gt;Logs/ScriptLog.txt&amp;lt;/code&amp;gt;. That file is useful when an &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; call, argument, inline block, or generated line fails to compile.&lt;br /&gt;
&lt;br /&gt;
== Runtime Timing ==&lt;br /&gt;
&lt;br /&gt;
When OpenBOR updates an entity&amp;#039;s animation frame, the relevant order is:&lt;br /&gt;
&lt;br /&gt;
# Validates the requested index against the current animation.&lt;br /&gt;
# Makes the entity the active execution subject.&lt;br /&gt;
# Assigns the requested index as the entity&amp;#039;s current animation position.&lt;br /&gt;
# Calculates the next animation timestamp from the new index&amp;#039;s delay and clears frame pause state.&lt;br /&gt;
# Populates &amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;animnum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;animhandle&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Executes the current model&amp;#039;s Animationscript.&lt;br /&gt;
# Executes the entity&amp;#039;s default-model Animationscript when the current model differs from its default model.&lt;br /&gt;
# Stops processing the old animation update when script changed the animation or frame index.&lt;br /&gt;
# Otherwise applies remaining native on-entry effects for the index.&lt;br /&gt;
&lt;br /&gt;
Native effects after Animationscript include configured movement, base adjustment, facing reversal, weapon changes, quake, sub-entity operations, child spawning, sounds, jump velocity, and legacy projectile launching.&lt;br /&gt;
&lt;br /&gt;
The new frame index is already current when script begins. Frame-indexed collision, sprite, draw, delay, and other animation data can therefore be inspected through the current entity and animation. Remaining native on-entry operations have not yet executed.&lt;br /&gt;
&lt;br /&gt;
== Interrupting Native Frame Processing ==&lt;br /&gt;
&lt;br /&gt;
OpenBOR records the animation and requested frame before running Animationscript. After script returns, the engine compares those values with the entity&amp;#039;s current animation and frame.&lt;br /&gt;
&lt;br /&gt;
Changing either one interrupts the remainder of the original frame update. Native movement, flip, weapon, quake, spawn, sound, jump, and projectile instructions belonging to the abandoned frame do not execute afterward.&lt;br /&gt;
&lt;br /&gt;
This behavior supports clean branching and replacement:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pattern&lt;br /&gt;
! Use of &amp;lt;code&amp;gt;animationscript&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional attack branch&lt;br /&gt;
| Check input, hit state, meter, target position, or project variables, then enter another animation before the old frame launches its remaining native effects.&lt;br /&gt;
|-&lt;br /&gt;
| Dynamic action phase&lt;br /&gt;
| Mark startup, active, recovery, invulnerable, armored, cancelable, or vulnerable phases as specific indexes begin.&lt;br /&gt;
|-&lt;br /&gt;
| Motion control&lt;br /&gt;
| Adjust velocity or position before native frame movement and jump impulses are applied, or replace the frame to suppress them.&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized choreography&lt;br /&gt;
| Move, bind, animate, or release targets and helper entities at exact animation indexes for throws, team attacks, mounts, cut-ins, or transformations.&lt;br /&gt;
|-&lt;br /&gt;
| Custom effect routing&lt;br /&gt;
| Spawn projectiles, particles, sounds, camera effects, trails, decals, or interface feedback from reusable helper functions.&lt;br /&gt;
|-&lt;br /&gt;
| Procedural animation behavior&lt;br /&gt;
| Choose alternate timing, sprite state, direction, movement, or follow-up logic from runtime conditions rather than fixed model data alone.&lt;br /&gt;
|-&lt;br /&gt;
| State cleanup&lt;br /&gt;
| Clear temporary flags, armor, invincibility, bindings, overlays, or resources at the exact animation update where their phase ends.&lt;br /&gt;
|-&lt;br /&gt;
| Debugging and telemetry&lt;br /&gt;
| Record animation transitions and frame indexes, inspect unexpected branches, or expose current action phases to development tools.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Frame-changing functions may immediately start another animation update. Scripts that repeatedly reset the same animation or redirect to a frame whose code redirects back can create recursive execution or an endless transition chain. Guard such branches with state or a condition that becomes false after the transition.&lt;br /&gt;
&lt;br /&gt;
== Execution Frequency ==&lt;br /&gt;
&lt;br /&gt;
Animationscript responds to indexed animation updates, not display refresh or every entity update.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Situation&lt;br /&gt;
! Animationscript execution&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Normal animation start&lt;br /&gt;
| Yes&lt;br /&gt;
| Entering a newly started animation normally updates index &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; immediately.&lt;br /&gt;
|-&lt;br /&gt;
| Natural frame advance&lt;br /&gt;
| Yes&lt;br /&gt;
| Runs when the configured delay expires and animation processing advances to the next index.&lt;br /&gt;
|-&lt;br /&gt;
| Loop transition&lt;br /&gt;
| Yes&lt;br /&gt;
| Runs when the animation moves from its loop end to the configured loop start.&lt;br /&gt;
|-&lt;br /&gt;
| Frame held for several logic or display updates&lt;br /&gt;
| No repeated execution&lt;br /&gt;
| Delay controls how long the current index remains active; Animationscript does not poll throughout that hold.&lt;br /&gt;
|-&lt;br /&gt;
| Infinite-delay frame&lt;br /&gt;
| Once on entry&lt;br /&gt;
| No further execution occurs until another operation changes or updates the animation frame.&lt;br /&gt;
|-&lt;br /&gt;
| Stopped non-looping animation&lt;br /&gt;
| No further execution&lt;br /&gt;
| Reaching the end disables animation advancement unless another operation starts or updates animation state.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;updateframe()&amp;lt;/code&amp;gt;&lt;br /&gt;
| Yes, while the entity is animating&lt;br /&gt;
| Explicitly routes the requested index through native frame-update processing.&lt;br /&gt;
|-&lt;br /&gt;
| Native land-frame, drop-frame, bind-frame, or grab-frame adjustment&lt;br /&gt;
| Yes, while animating&lt;br /&gt;
| These systems explicitly call the same frame-update path.&lt;br /&gt;
|-&lt;br /&gt;
| Direct raw animation-position assignment&lt;br /&gt;
| No generated update by itself&lt;br /&gt;
| Directly changing a property is not equivalent to &amp;lt;code&amp;gt;updateframe()&amp;lt;/code&amp;gt; and does not apply the full frame-entry path.&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized animation change retaining the current index&lt;br /&gt;
| No immediate fresh update&lt;br /&gt;
| Native synchronization may transfer the existing position without re-entering frame-update processing.&lt;br /&gt;
|-&lt;br /&gt;
| Entity frozen or paused without advancing&lt;br /&gt;
| No repeated execution&lt;br /&gt;
| The script resumes when animation processing reaches another frame update.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Repeated visits to an index are separate updates. Looping back to frame &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, explicitly calling &amp;lt;code&amp;gt;updateframe()&amp;lt;/code&amp;gt;, or later re-entering the same animation may execute its &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; code again.&lt;br /&gt;
&lt;br /&gt;
== Local Variables ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Local variable&lt;br /&gt;
! Type&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt;&lt;br /&gt;
| Entity pointer&lt;br /&gt;
| Entity whose animation frame is being updated.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;animnum&amp;lt;/code&amp;gt;&lt;br /&gt;
| Integer&lt;br /&gt;
| Current logical animation identifier, such as a named &amp;lt;code&amp;gt;ANI_*&amp;lt;/code&amp;gt; constant. The same logical identifier may refer to different animation objects on different models.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt;&lt;br /&gt;
| Integer&lt;br /&gt;
| Current zero-based index shared by the animation&amp;#039;s frame-specific property arrays.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;animhandle&amp;lt;/code&amp;gt;&lt;br /&gt;
| Integer&lt;br /&gt;
| Unique runtime identifier of the concrete loaded animation object. OpenBOR uses this value to route generated &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; sections to the correct animation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;animnum&amp;lt;/code&amp;gt; for semantic comparisons against &amp;lt;code&amp;gt;ANI_*&amp;lt;/code&amp;gt; constants. Use &amp;lt;code&amp;gt;animhandle&amp;lt;/code&amp;gt; only when concrete animation identity matters. Runtime handles depend on loaded animation allocation and should not be hardcoded or stored as portable project data.&lt;br /&gt;
&lt;br /&gt;
Assignments to event locals do not directly change the entity or animation. Use animation, entity, and frame-update interfaces for native changes.&lt;br /&gt;
&lt;br /&gt;
The event does not provide &amp;lt;code&amp;gt;attacker&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;damage&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;blocked&amp;lt;/code&amp;gt;, or other combat-event locals. Read relevant entity or project state when animation behavior depends on prior combat context.&lt;br /&gt;
&lt;br /&gt;
== @cmd and @script Comparison ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feature&lt;br /&gt;
! &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
! &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Scope&lt;br /&gt;
| Immediately following frame command&lt;br /&gt;
| Every frame update in the containing animation&lt;br /&gt;
|-&lt;br /&gt;
| Generated form&lt;br /&gt;
| Function call guarded by animation handle and frame index&lt;br /&gt;
| Inline code guarded by animation handle&lt;br /&gt;
|-&lt;br /&gt;
| Best use&lt;br /&gt;
| Short, reusable, precisely timed function calls&lt;br /&gt;
| Conditional logic evaluated throughout an animation&lt;br /&gt;
|-&lt;br /&gt;
| Function definitions&lt;br /&gt;
| Calls existing functions&lt;br /&gt;
| Cannot define functions inside the inserted block&lt;br /&gt;
|-&lt;br /&gt;
| Frame test&lt;br /&gt;
| Generated automatically&lt;br /&gt;
| Creator supplies a &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt; condition when needed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
External helper functions keep complex logic reusable and testable, while &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; provides compact timing in model data. Inline &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; is useful when the decision itself needs to be evaluated at each animation update.&lt;br /&gt;
&lt;br /&gt;
== Return and Exit Behavior ==&lt;br /&gt;
&lt;br /&gt;
Animationscript has no event acceptance or cancellation return value. Returning a value does not confirm a frame, while returning from generated or inline code only ends that script execution path.&lt;br /&gt;
&lt;br /&gt;
Stopping script execution does not by itself stop native processing for the current frame. OpenBOR automatically interrupts the remaining old-frame operations when script changes the entity&amp;#039;s animation or frame index. Other state changes affect later native instructions according to the rules of those individual systems.&lt;br /&gt;
&lt;br /&gt;
Functions called through &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; may return values for use by other script code, but the generated standalone call does not consume the returned value.&lt;br /&gt;
&lt;br /&gt;
== Model and Default-Model Execution ==&lt;br /&gt;
&lt;br /&gt;
OpenBOR executes the Animationscript belonging to the entity&amp;#039;s current model first. When model switching has made the current model different from the entity&amp;#039;s original default model, OpenBOR also executes the default model&amp;#039;s Animationscript afterward.&lt;br /&gt;
&lt;br /&gt;
Both executions receive the same entity, logical animation ID, current frame index, and concrete animation handle. Generated animation-handle guards determine which model-specific &amp;lt;code&amp;gt;@cmd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;@script&amp;lt;/code&amp;gt; sections match the concrete animation.&lt;br /&gt;
&lt;br /&gt;
This behavior is based on current and default model ownership, not on a special model name. Naming a model &amp;lt;code&amp;gt;global_model&amp;lt;/code&amp;gt; does not automatically invoke it for every entity. Shared helpers may instead be included in participating animation-script sources.&lt;br /&gt;
&lt;br /&gt;
Lifecycle functions such as &amp;lt;code&amp;gt;oncreate()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ondestroy()&amp;lt;/code&amp;gt;, when present, follow script-instance creation and destruction. They do not run on every animation frame update.&lt;br /&gt;
&lt;br /&gt;
== Related Scripts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Script&lt;br /&gt;
! Runtime cadence&lt;br /&gt;
! Primary use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;animationscript&amp;lt;/code&amp;gt;&lt;br /&gt;
| When an animating entity enters or is moved through an indexed animation frame&lt;br /&gt;
| Precisely timed action logic and animation-state transitions.&lt;br /&gt;
|-&lt;br /&gt;
| [[Updatescript]]&lt;br /&gt;
| Entity update cadence&lt;br /&gt;
| Continuous entity behavior that should not depend on animation advancement.&lt;br /&gt;
|-&lt;br /&gt;
| [[Thinkscript]]&lt;br /&gt;
| Entity thinking cadence&lt;br /&gt;
| AI decisions and periodic behavior selection.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ondrawscript]]&lt;br /&gt;
| Entity drawing cadence&lt;br /&gt;
| Visual preparation and draw-time behavior.&lt;br /&gt;
|-&lt;br /&gt;
| [[Onpainscript]]&lt;br /&gt;
| Native pain entry&lt;br /&gt;
| Reaction logic when an entity successfully enters standing pain.&lt;br /&gt;
|-&lt;br /&gt;
| [[Onfallscript]]&lt;br /&gt;
| Native fall entry&lt;br /&gt;
| Reaction logic when an entity successfully enters fall.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Animation]]&lt;br /&gt;
* [[Animations]]&lt;br /&gt;
* [[Frame]]&lt;br /&gt;
* [[Delay]]&lt;br /&gt;
* [[Script Overview]]&lt;br /&gt;
* [[Logging]]&lt;br /&gt;
* [[Updatescript]]&lt;br /&gt;
* [[Thinkscript]]&lt;br /&gt;
* [[Ondrawscript]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Openbor]]&lt;br /&gt;
[[Category:Animation]]&lt;br /&gt;
[[Category:Model]]&lt;br /&gt;
[[Category:Script]]&lt;/div&gt;</summary>
		<author><name>Dcurrent</name></author>
	</entry>
</feed>