mirror of
				https://git.kittycat.homes/zoe/pegchamp.git
				synced 2024-08-15 03:15:39 +00:00 
			
		
		
		
	added html
This commit is contained in:
		
							parent
							
								
									6539056cfb
								
							
						
					
					
						commit
						c8747328cf
					
				
					 9 changed files with 1205 additions and 3 deletions
				
			
		|  | @ -12,8 +12,6 @@ func save_game(): | |||
| 		"sfx_volume" : AudioServer.get_bus_volume_db(AudioServer.get_bus_index("SFX")) | ||||
| 	} | ||||
| 	 | ||||
| 	print(data) | ||||
| 	 | ||||
| 	var file = File.new() | ||||
| 	var err = file.open(save_path, File.WRITE) | ||||
| 	if err == OK: | ||||
|  |  | |||
|  | @ -105,7 +105,7 @@ custom_features="" | |||
| export_filter="all_resources" | ||||
| include_filter="" | ||||
| exclude_filter="" | ||||
| export_path="" | ||||
| export_path="html/pegchamp.html" | ||||
| script_export_mode=1 | ||||
| script_encryption_key="" | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								html/favicon.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								html/favicon.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 229 B | 
							
								
								
									
										186
									
								
								html/pegchamp.audio.worklet.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								html/pegchamp.audio.worklet.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,186 @@ | |||
| /*************************************************************************/ | ||||
| /*  audio.worklet.js                                                     */ | ||||
| /*************************************************************************/ | ||||
| /*                       This file is part of:                           */ | ||||
| /*                           GODOT ENGINE                                */ | ||||
| /*                      https://godotengine.org                          */ | ||||
| /*************************************************************************/ | ||||
| /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ | ||||
| /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ | ||||
| /*                                                                       */ | ||||
| /* Permission is hereby granted, free of charge, to any person obtaining */ | ||||
| /* a copy of this software and associated documentation files (the       */ | ||||
| /* "Software"), to deal in the Software without restriction, including   */ | ||||
| /* without limitation the rights to use, copy, modify, merge, publish,   */ | ||||
| /* distribute, sublicense, and/or sell copies of the Software, and to    */ | ||||
| /* permit persons to whom the Software is furnished to do so, subject to */ | ||||
| /* the following conditions:                                             */ | ||||
| /*                                                                       */ | ||||
| /* The above copyright notice and this permission notice shall be        */ | ||||
| /* included in all copies or substantial portions of the Software.       */ | ||||
| /*                                                                       */ | ||||
| /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | ||||
| /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | ||||
| /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | ||||
| /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | ||||
| /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | ||||
| /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | ||||
| /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | ||||
| /*************************************************************************/ | ||||
| 
 | ||||
| class RingBuffer { | ||||
| 	constructor(p_buffer, p_state) { | ||||
| 		this.buffer = p_buffer; | ||||
| 		this.avail = p_state; | ||||
| 		this.rpos = 0; | ||||
| 		this.wpos = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	data_left() { | ||||
| 		return Atomics.load(this.avail, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	space_left() { | ||||
| 		return this.buffer.length - this.data_left(); | ||||
| 	} | ||||
| 
 | ||||
| 	read(output) { | ||||
| 		const size = this.buffer.length; | ||||
| 		let from = 0; | ||||
| 		let to_write = output.length; | ||||
| 		if (this.rpos + to_write > size) { | ||||
| 			const high = size - this.rpos; | ||||
| 			output.set(this.buffer.subarray(this.rpos, size)); | ||||
| 			from = high; | ||||
| 			to_write -= high; | ||||
| 			this.rpos = 0; | ||||
| 		} | ||||
| 		output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from); | ||||
| 		this.rpos += to_write; | ||||
| 		Atomics.add(this.avail, 0, -output.length); | ||||
| 		Atomics.notify(this.avail, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	write(p_buffer) { | ||||
| 		const to_write = p_buffer.length; | ||||
| 		const mw = this.buffer.length - this.wpos; | ||||
| 		if (mw >= to_write) { | ||||
| 			this.buffer.set(p_buffer, this.wpos); | ||||
| 		} else { | ||||
| 			const high = p_buffer.subarray(0, to_write - mw); | ||||
| 			const low = p_buffer.subarray(to_write - mw); | ||||
| 			this.buffer.set(high, this.wpos); | ||||
| 			this.buffer.set(low); | ||||
| 		} | ||||
| 		let diff = to_write; | ||||
| 		if (this.wpos + diff >= this.buffer.length) { | ||||
| 			diff -= this.buffer.length; | ||||
| 		} | ||||
| 		this.wpos += diff; | ||||
| 		Atomics.add(this.avail, 0, to_write); | ||||
| 		Atomics.notify(this.avail, 0); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| class GodotProcessor extends AudioWorkletProcessor { | ||||
| 	constructor() { | ||||
| 		super(); | ||||
| 		this.running = true; | ||||
| 		this.lock = null; | ||||
| 		this.notifier = null; | ||||
| 		this.output = null; | ||||
| 		this.output_buffer = new Float32Array(); | ||||
| 		this.input = null; | ||||
| 		this.input_buffer = new Float32Array(); | ||||
| 		this.port.onmessage = (event) => { | ||||
| 			const cmd = event.data['cmd']; | ||||
| 			const data = event.data['data']; | ||||
| 			this.parse_message(cmd, data); | ||||
| 		}; | ||||
| 	} | ||||
| 
 | ||||
| 	process_notify() { | ||||
| 		Atomics.add(this.notifier, 0, 1); | ||||
| 		Atomics.notify(this.notifier, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	parse_message(p_cmd, p_data) { | ||||
| 		if (p_cmd === 'start' && p_data) { | ||||
| 			const state = p_data[0]; | ||||
| 			let idx = 0; | ||||
| 			this.lock = state.subarray(idx, ++idx); | ||||
| 			this.notifier = state.subarray(idx, ++idx); | ||||
| 			const avail_in = state.subarray(idx, ++idx); | ||||
| 			const avail_out = state.subarray(idx, ++idx); | ||||
| 			this.input = new RingBuffer(p_data[1], avail_in); | ||||
| 			this.output = new RingBuffer(p_data[2], avail_out); | ||||
| 		} else if (p_cmd === 'stop') { | ||||
| 			this.runing = false; | ||||
| 			this.output = null; | ||||
| 			this.input = null; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	static array_has_data(arr) { | ||||
| 		return arr.length && arr[0].length && arr[0][0].length; | ||||
| 	} | ||||
| 
 | ||||
| 	process(inputs, outputs, parameters) { | ||||
| 		if (!this.running) { | ||||
| 			return false; // Stop processing.
 | ||||
| 		} | ||||
| 		if (this.output === null) { | ||||
| 			return true; // Not ready yet, keep processing.
 | ||||
| 		} | ||||
| 		const process_input = GodotProcessor.array_has_data(inputs); | ||||
| 		if (process_input) { | ||||
| 			const input = inputs[0]; | ||||
| 			const chunk = input[0].length * input.length; | ||||
| 			if (this.input_buffer.length !== chunk) { | ||||
| 				this.input_buffer = new Float32Array(chunk); | ||||
| 			} | ||||
| 			if (this.input.space_left() >= chunk) { | ||||
| 				GodotProcessor.write_input(this.input_buffer, input); | ||||
| 				this.input.write(this.input_buffer); | ||||
| 			} else { | ||||
| 				this.port.postMessage('Input buffer is full! Skipping input frame.'); | ||||
| 			} | ||||
| 		} | ||||
| 		const process_output = GodotProcessor.array_has_data(outputs); | ||||
| 		if (process_output) { | ||||
| 			const output = outputs[0]; | ||||
| 			const chunk = output[0].length * output.length; | ||||
| 			if (this.output_buffer.length !== chunk) { | ||||
| 				this.output_buffer = new Float32Array(chunk); | ||||
| 			} | ||||
| 			if (this.output.data_left() >= chunk) { | ||||
| 				this.output.read(this.output_buffer); | ||||
| 				GodotProcessor.write_output(output, this.output_buffer); | ||||
| 			} else { | ||||
| 				this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); | ||||
| 			} | ||||
| 		} | ||||
| 		this.process_notify(); | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	static write_output(dest, source) { | ||||
| 		const channels = dest.length; | ||||
| 		for (let ch = 0; ch < channels; ch++) { | ||||
| 			for (let sample = 0; sample < dest[ch].length; sample++) { | ||||
| 				dest[ch][sample] = source[sample * channels + ch]; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	static write_input(dest, source) { | ||||
| 		const channels = source.length; | ||||
| 		for (let ch = 0; ch < channels; ch++) { | ||||
| 			for (let sample = 0; sample < source[ch].length; sample++) { | ||||
| 				dest[sample * channels + ch] = source[ch][sample]; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| registerProcessor('godot-processor', GodotProcessor); | ||||
							
								
								
									
										246
									
								
								html/pegchamp.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								html/pegchamp.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,246 @@ | |||
| <!DOCTYPE html> | ||||
| <html xmlns='http://www.w3.org/1999/xhtml' lang='' xml:lang=''> | ||||
| <head> | ||||
| 	<meta charset='utf-8' /> | ||||
| 	<meta name='viewport' content='width=device-width, user-scalable=no' /> | ||||
| 	<link id='-gd-engine-icon' rel='icon' type='image/png' href='favicon.png' /> | ||||
| 	<title>pegchamp</title> | ||||
| 	<style type='text/css'> | ||||
| 
 | ||||
| 		body { | ||||
| 			touch-action: none; | ||||
| 			margin: 0; | ||||
| 			border: 0 none; | ||||
| 			padding: 0; | ||||
| 			text-align: center; | ||||
| 			background-color: black; | ||||
| 		} | ||||
| 
 | ||||
| 		#canvas { | ||||
| 			display: block; | ||||
| 			margin: 0; | ||||
| 			color: white; | ||||
| 		} | ||||
| 
 | ||||
| 		#canvas:focus { | ||||
| 			outline: none; | ||||
| 		} | ||||
| 
 | ||||
| 		.godot { | ||||
| 			font-family: 'Noto Sans', 'Droid Sans', Arial, sans-serif; | ||||
| 			color: #e0e0e0; | ||||
| 			background-color: #3b3943; | ||||
| 			background-image: linear-gradient(to bottom, #403e48, #35333c); | ||||
| 			border: 1px solid #45434e; | ||||
| 			box-shadow: 0 0 1px 1px #2f2d35; | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
| 		/* Status display | ||||
| 		 * ============== */ | ||||
| 
 | ||||
| 		#status { | ||||
| 			position: absolute; | ||||
| 			left: 0; | ||||
| 			top: 0; | ||||
| 			right: 0; | ||||
| 			bottom: 0; | ||||
| 			display: flex; | ||||
| 			justify-content: center; | ||||
| 			align-items: center; | ||||
| 			/* don't consume click events - make children visible explicitly */ | ||||
| 			visibility: hidden; | ||||
| 		} | ||||
| 
 | ||||
| 		#status-progress { | ||||
| 			width: 366px; | ||||
| 			height: 7px; | ||||
| 			background-color: #38363A; | ||||
| 			border: 1px solid #444246; | ||||
| 			padding: 1px; | ||||
| 			box-shadow: 0 0 2px 1px #1B1C22; | ||||
| 			border-radius: 2px; | ||||
| 			visibility: visible; | ||||
| 		} | ||||
| 
 | ||||
| 		@media only screen and (orientation:portrait) { | ||||
| 			#status-progress { | ||||
| 				width: 61.8%; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		#status-progress-inner { | ||||
| 			height: 100%; | ||||
| 			width: 0; | ||||
| 			box-sizing: border-box; | ||||
| 			transition: width 0.5s linear; | ||||
| 			background-color: #202020; | ||||
| 			border: 1px solid #222223; | ||||
| 			box-shadow: 0 0 1px 1px #27282E; | ||||
| 			border-radius: 3px; | ||||
| 		} | ||||
| 
 | ||||
| 		#status-indeterminate { | ||||
| 			visibility: visible; | ||||
| 			position: relative; | ||||
| 		} | ||||
| 
 | ||||
| 		#status-indeterminate > div { | ||||
| 			width: 4.5px; | ||||
| 			height: 0; | ||||
| 			border-style: solid; | ||||
| 			border-width: 9px 3px 0 3px; | ||||
| 			border-color: #2b2b2b transparent transparent transparent; | ||||
| 			transform-origin: center 21px; | ||||
| 			position: absolute; | ||||
| 		} | ||||
| 
 | ||||
| 		#status-indeterminate > div:nth-child(1) { transform: rotate( 22.5deg); } | ||||
| 		#status-indeterminate > div:nth-child(2) { transform: rotate( 67.5deg); } | ||||
| 		#status-indeterminate > div:nth-child(3) { transform: rotate(112.5deg); } | ||||
| 		#status-indeterminate > div:nth-child(4) { transform: rotate(157.5deg); } | ||||
| 		#status-indeterminate > div:nth-child(5) { transform: rotate(202.5deg); } | ||||
| 		#status-indeterminate > div:nth-child(6) { transform: rotate(247.5deg); } | ||||
| 		#status-indeterminate > div:nth-child(7) { transform: rotate(292.5deg); } | ||||
| 		#status-indeterminate > div:nth-child(8) { transform: rotate(337.5deg); } | ||||
| 
 | ||||
| 		#status-notice { | ||||
| 			margin: 0 100px; | ||||
| 			line-height: 1.3; | ||||
| 			visibility: visible; | ||||
| 			padding: 4px 6px; | ||||
| 			visibility: visible; | ||||
| 		} | ||||
| 	</style> | ||||
| 
 | ||||
| </head> | ||||
| <body> | ||||
| 	<canvas id='canvas'> | ||||
| 		HTML5 canvas appears to be unsupported in the current browser.<br /> | ||||
| 		Please try updating or use a different browser. | ||||
| 	</canvas> | ||||
| 	<div id='status'> | ||||
| 		<div id='status-progress' style='display: none;' oncontextmenu='event.preventDefault();'><div id ='status-progress-inner'></div></div> | ||||
| 		<div id='status-indeterminate' style='display: none;' oncontextmenu='event.preventDefault();'> | ||||
| 			<div></div> | ||||
| 			<div></div> | ||||
| 			<div></div> | ||||
| 			<div></div> | ||||
| 			<div></div> | ||||
| 			<div></div> | ||||
| 			<div></div> | ||||
| 			<div></div> | ||||
| 		</div> | ||||
| 		<div id='status-notice' class='godot' style='display: none;'></div> | ||||
| 	</div> | ||||
| 
 | ||||
| 	<script type='text/javascript' src='pegchamp.js'></script> | ||||
| 	<script type='text/javascript'>//<![CDATA[ | ||||
| 
 | ||||
| 		const GODOT_CONFIG = {"args":[],"canvasResizePolicy":2,"executable":"pegchamp","experimentalVK":false,"fileSizes":{"pegchamp.pck":6374176,"pegchamp.wasm":18140456},"gdnativeLibs":[]}; | ||||
| 		var engine = new Engine(GODOT_CONFIG); | ||||
| 
 | ||||
| 		(function() { | ||||
| 			const INDETERMINATE_STATUS_STEP_MS = 100; | ||||
| 			var statusProgress = document.getElementById('status-progress'); | ||||
| 			var statusProgressInner = document.getElementById('status-progress-inner'); | ||||
| 			var statusIndeterminate = document.getElementById('status-indeterminate'); | ||||
| 			var statusNotice = document.getElementById('status-notice'); | ||||
| 
 | ||||
| 			var initializing = true; | ||||
| 			var statusMode = 'hidden'; | ||||
| 
 | ||||
| 			var animationCallbacks = []; | ||||
| 			function animate(time) { | ||||
| 				animationCallbacks.forEach(callback => callback(time)); | ||||
| 				requestAnimationFrame(animate); | ||||
| 			} | ||||
| 			requestAnimationFrame(animate); | ||||
| 
 | ||||
| 			function setStatusMode(mode) { | ||||
| 
 | ||||
| 				if (statusMode === mode || !initializing) | ||||
| 					return; | ||||
| 				[statusProgress, statusIndeterminate, statusNotice].forEach(elem => { | ||||
| 					elem.style.display = 'none'; | ||||
| 				}); | ||||
| 				animationCallbacks = animationCallbacks.filter(function(value) { | ||||
| 					return (value != animateStatusIndeterminate); | ||||
| 				}); | ||||
| 				switch (mode) { | ||||
| 					case 'progress': | ||||
| 						statusProgress.style.display = 'block'; | ||||
| 						break; | ||||
| 					case 'indeterminate': | ||||
| 						statusIndeterminate.style.display = 'block'; | ||||
| 						animationCallbacks.push(animateStatusIndeterminate); | ||||
| 						break; | ||||
| 					case 'notice': | ||||
| 						statusNotice.style.display = 'block'; | ||||
| 						break; | ||||
| 					case 'hidden': | ||||
| 						break; | ||||
| 					default: | ||||
| 						throw new Error('Invalid status mode'); | ||||
| 				} | ||||
| 				statusMode = mode; | ||||
| 			} | ||||
| 
 | ||||
| 			function animateStatusIndeterminate(ms) { | ||||
| 				var i = Math.floor(ms / INDETERMINATE_STATUS_STEP_MS % 8); | ||||
| 				if (statusIndeterminate.children[i].style.borderTopColor == '') { | ||||
| 					Array.prototype.slice.call(statusIndeterminate.children).forEach(child => { | ||||
| 						child.style.borderTopColor = ''; | ||||
| 					}); | ||||
| 					statusIndeterminate.children[i].style.borderTopColor = '#dfdfdf'; | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			function setStatusNotice(text) { | ||||
| 				while (statusNotice.lastChild) { | ||||
| 					statusNotice.removeChild(statusNotice.lastChild); | ||||
| 				} | ||||
| 				var lines = text.split('\n'); | ||||
| 				lines.forEach((line) => { | ||||
| 					statusNotice.appendChild(document.createTextNode(line)); | ||||
| 					statusNotice.appendChild(document.createElement('br')); | ||||
| 				}); | ||||
| 			}; | ||||
| 
 | ||||
| 			function displayFailureNotice(err) { | ||||
| 				var msg = err.message || err; | ||||
| 				console.error(msg); | ||||
| 				setStatusNotice(msg); | ||||
| 				setStatusMode('notice'); | ||||
| 				initializing = false; | ||||
| 			}; | ||||
| 
 | ||||
| 			if (!Engine.isWebGLAvailable()) { | ||||
| 				displayFailureNotice('WebGL not available'); | ||||
| 			} else { | ||||
| 				setStatusMode('indeterminate'); | ||||
| 				engine.startGame({ | ||||
| 					'onProgress': function (current, total) { | ||||
| 						if (total > 0) { | ||||
| 							statusProgressInner.style.width = current/total * 100 + '%'; | ||||
| 							setStatusMode('progress'); | ||||
| 							if (current === total) { | ||||
| 								// wait for progress bar animation | ||||
| 								setTimeout(() => { | ||||
| 									setStatusMode('indeterminate'); | ||||
| 								}, 500); | ||||
| 							} | ||||
| 						} else { | ||||
| 							setStatusMode('indeterminate'); | ||||
| 						} | ||||
| 					}, | ||||
| 				}).then(() => { | ||||
| 					setStatusMode('hidden'); | ||||
| 					initializing = false; | ||||
| 				}, displayFailureNotice); | ||||
| 			} | ||||
| 		})(); | ||||
| 	//]]></script> | ||||
| </body> | ||||
| </html> | ||||
| 
 | ||||
							
								
								
									
										772
									
								
								html/pegchamp.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										772
									
								
								html/pegchamp.js
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								html/pegchamp.pck
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								html/pegchamp.pck
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								html/pegchamp.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								html/pegchamp.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 229 B | 
							
								
								
									
										
											BIN
										
									
								
								html/pegchamp.wasm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								html/pegchamp.wasm
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue