tickticktick
This commit is contained in:
parent
713ecbfd8f
commit
9bb9c6e0ea
10 changed files with 188 additions and 96 deletions
|
@ -1,13 +0,0 @@
|
||||||
.machine {
|
|
||||||
width: 12.5em;
|
|
||||||
}
|
|
||||||
.rotorbox {
|
|
||||||
padding-left: 25%;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
.rotor {
|
|
||||||
max-width: 1em;
|
|
||||||
}
|
|
||||||
.rotorwheel {
|
|
||||||
background-color: #101010;
|
|
||||||
}
|
|
|
@ -1,81 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import ReactDOM from 'react-dom/client';
|
|
||||||
import './App.css';
|
|
||||||
|
|
||||||
class Rotor extends React.Component {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
}
|
|
||||||
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
||||||
state = {
|
|
||||||
pos: 0,
|
|
||||||
current: this.alphabet[0]
|
|
||||||
}
|
|
||||||
tick(me) {
|
|
||||||
if (this.state.pos === 26) {
|
|
||||||
// roll next rotor
|
|
||||||
this.setState({
|
|
||||||
pos: 0,
|
|
||||||
current: this.alphabet[0]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.setState({
|
|
||||||
current: this.alphabet[this.state.pos++]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<span className='rotor' onClick={(me) => this.tick(me)}>
|
|
||||||
<div className='rotorwheel'>{this.state.current}|</div>
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Rotorbox extends React.Component {
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div className='rotorbox'>
|
|
||||||
<Rotor/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Lightbox() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<div> Q W E R T Y U I O P</div>
|
|
||||||
<div> A S D F G H J K L</div>
|
|
||||||
<div> Z X C V B N M</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function Keyboard() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<div> Q W E R T Y U I O P</div>
|
|
||||||
<div> A S D F G H J K L</div>
|
|
||||||
<div> Z X C V B N M</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
class App extends React.Component {
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div className='machine'>
|
|
||||||
<Rotorbox />
|
|
||||||
<hr/>
|
|
||||||
<Lightbox />
|
|
||||||
<hr/>
|
|
||||||
<Keyboard />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default App;
|
|
6
enigma/src/Machine.css
Normal file
6
enigma/src/Machine.css
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
.machine {
|
||||||
|
margin: .5em;
|
||||||
|
width: 11.5em;
|
||||||
|
outline-style: solid;
|
||||||
|
outline-color: #DA9475;
|
||||||
|
}
|
41
enigma/src/Machine.js
Normal file
41
enigma/src/Machine.js
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import { Component } from 'react';
|
||||||
|
import './Machine.css';
|
||||||
|
import Rotorbox from './components/Rotorbox.js';
|
||||||
|
|
||||||
|
function Lightbox() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div> Q W E R T Z U I O</div>
|
||||||
|
<div> A S D F G H J K</div>
|
||||||
|
<div> P Y X C V B N M L</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Keyboard extends Component{
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div> Q W E R T Z U I O</div>
|
||||||
|
<div> A S D F G H J K</div>
|
||||||
|
<div> P Y X C V B N M L</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Machine extends Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className='machine'>
|
||||||
|
<Rotorbox/>
|
||||||
|
<hr/>
|
||||||
|
<Lightbox/>
|
||||||
|
<hr/>
|
||||||
|
<Keyboard/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Machine;
|
9
enigma/src/components/Rotor.css
Normal file
9
enigma/src/components/Rotor.css
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
.Rotor {
|
||||||
|
background-image: linear-gradient(#111, #ddd, #111);
|
||||||
|
color: black;
|
||||||
|
outline-style: dashed;
|
||||||
|
outline-width: .2em;
|
||||||
|
outline-offset: -.1em;
|
||||||
|
padding:.2em;
|
||||||
|
margin: .05em;
|
||||||
|
}
|
39
enigma/src/components/Rotor.js
Normal file
39
enigma/src/components/Rotor.js
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import React from 'react';
|
||||||
|
import './Rotor.css';
|
||||||
|
|
||||||
|
class Rotor extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
}
|
||||||
|
letter(i) {
|
||||||
|
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||||
|
if (i > 25) {
|
||||||
|
return alphabet[i - 26]
|
||||||
|
}
|
||||||
|
else if (i < 0) {
|
||||||
|
return alphabet[26 + i]
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return alphabet[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tick() {
|
||||||
|
if (this.state.pos === 25) {
|
||||||
|
this.setState((state) => ({pos: 0}));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.setState((state) => ({pos: state.pos + 1}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<span className='Rotor'>
|
||||||
|
<div>{this.letter(this.props.pos + 1)}</div>
|
||||||
|
<div>{this.letter(this.props.pos)}</div>
|
||||||
|
<div>{this.letter(this.props.pos - 1)}</div>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Rotor
|
5
enigma/src/components/Rotorbox.css
Normal file
5
enigma/src/components/Rotorbox.css
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
.Rotorbox {
|
||||||
|
padding-left: 20%;
|
||||||
|
background: #010101;
|
||||||
|
display: flex;
|
||||||
|
}
|
86
enigma/src/components/Rotorbox.js
Normal file
86
enigma/src/components/Rotorbox.js
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
import React from 'react';
|
||||||
|
import Rotor from './Rotor.js';
|
||||||
|
import './Rotorbox.css';
|
||||||
|
import clicksound from '../media/mixkit-hard-click-1118.wav';
|
||||||
|
|
||||||
|
class Rotorbox extends React.Component {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.state = {
|
||||||
|
rotor0: 11,
|
||||||
|
rotor1: 8,
|
||||||
|
rotor2: 6,
|
||||||
|
rotor3: 12,
|
||||||
|
rotor4: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
tick() {
|
||||||
|
const audio = new Audio(clicksound);
|
||||||
|
audio.loop = false;
|
||||||
|
audio.playbackRate = 3.0;
|
||||||
|
audio.play();
|
||||||
|
if (this.state.rotor4 > 24) {
|
||||||
|
this.setState(state => ({
|
||||||
|
rotor3: state.rotor3 +1,
|
||||||
|
rotor4: 0
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
if (this.state.rotor3 > 24) {
|
||||||
|
this.setState(state => ({
|
||||||
|
rotor2: state.rotor2 +1,
|
||||||
|
rotor3: 0
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
if (this.state.rotor2 > 24) {
|
||||||
|
this.setState(state => ({
|
||||||
|
rotor1: state.rotor1 +1,
|
||||||
|
rotor2: 0
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
if (this.state.rotor1 > 24) {
|
||||||
|
this.setState(state => ({
|
||||||
|
rotor0: state.rotor0 +1,
|
||||||
|
rotor1: 0
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.setState(state => ({
|
||||||
|
rotor4: state.rotor4 +1
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
componentDidMount() {
|
||||||
|
this.timerID = setInterval(
|
||||||
|
() => this.tick(),
|
||||||
|
200
|
||||||
|
);
|
||||||
|
}
|
||||||
|
componentWillUnmount() {
|
||||||
|
clearInterval(this.timerID);
|
||||||
|
}
|
||||||
|
lulz() {
|
||||||
|
let balls = {
|
||||||
|
rotor0: 2,
|
||||||
|
rotor1: 0,
|
||||||
|
rotor2: 11,
|
||||||
|
rotor3: 11,
|
||||||
|
rotor4: 25
|
||||||
|
}
|
||||||
|
if (this.state !== balls) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className='Rotorbox'>
|
||||||
|
<Rotor pos={this.state.rotor0}/>
|
||||||
|
<Rotor pos={this.state.rotor1}/>
|
||||||
|
<Rotor pos={this.state.rotor2}/>
|
||||||
|
<Rotor pos={this.state.rotor3}/>
|
||||||
|
<Rotor pos={this.state.rotor4}/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Rotorbox;
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
||||||
import ReactDOM from 'react-dom/client';
|
import ReactDOM from 'react-dom/client';
|
||||||
|
|
||||||
import './index.css';
|
import './index.css';
|
||||||
import App from './App';
|
import Machine from './Machine.js';
|
||||||
|
|
||||||
const root = ReactDOM.createRoot(document.getElementById("root"));
|
const root = ReactDOM.createRoot(document.getElementById("root"));
|
||||||
root.render(<App />);
|
root.render(<Machine />);
|
||||||
|
|
BIN
enigma/src/media/mixkit-hard-click-1118.wav
Normal file
BIN
enigma/src/media/mixkit-hard-click-1118.wav
Normal file
Binary file not shown.
Loading…
Add table
Reference in a new issue